[spip-dev] gasp, on se marche sur les pides, cvs ou pas

Avec ta manie de repasser derrière tout de suite... zut, on a bossé au même
endroit en même temps...

J'ai modifié tout mon bazar pour que ce soit beaucoup plus précis (ie qu'on
puisse surligner certaines zones et d'autres pas : par exemple ne pas
surligner la partie <HEAD> de la page.

C'est pas mal de modifs, moins lourdes que les tiennes, mais quand même
substantielles... L'idée est que

1) si tu ne mets rien dans tes squelettes, tout est parsé via var_s

2) si tu mets #DEBUT_SURLIGNE ou #FIN_SURLIGNE (emboités pas de problèmes,
   même si c'est mal emboité), ça démarre/arrête le surlignement.

Je vais essayer de faire la fusion des deux. Si je n'y arrive pas
j'écraserai tes modifs !

-- Fil

Fil wrote:

Avec ta manie de repasser derrière tout de suite... zut, on a bossé au même
endroit en même temps...

Ben, heu ! C'est toi qui as dit que je devais repasser derrière pour
faire plus clean :wink:

J'ai modifié tout mon bazar pour que ce soit beaucoup plus précis (ie qu'on
puisse surligner certaines zones et d'autres pas : par exemple ne pas
surligner la partie <HEAD> de la page.

J'ai peur que ce soit uzine à gaz, non ? Je sais pas si t'as vu, mais ma
version ne contient plus qu'une seule regexp, et surtout elle ne modifie
pas les accents de la page, seulement ceux de $var_recherche. C'est plus
propre.

Fil wrote:

C'est pas mal de modifs, moins lourdes que les tiennes, mais quand même
substantielles... L'idée est que

1) si tu ne mets rien dans tes squelettes, tout est parsé via var_s

2) si tu mets #DEBUT_SURLIGNE ou #FIN_SURLIGNE (emboités pas de problèmes,
   même si c'est mal emboité), ça démarre/arrête le surlignement.

Ils vont devenir quoi les #SURLIGNE s'il n'y a pas de recherche ?
Virés automatiquement par un filtre temps réel (beuh, et en php3) ?

Ben, heu ! C'est toi qui as dit que je devais repasser derrière pour
faire plus clean :wink:

oui je sais bien

J'ai peur que ce soit uzine à gaz, non ? Je sais pas si t'as vu, mais ma

Non, ça va, c'est plutôt cool.

version ne contient plus qu'une seule regexp, et surtout elle ne modifie
pas les accents de la page, seulement ceux de $var_recherche. C'est plus
propre.

Il faut qu'elle soit non greedy, car il est indispensable d'aller au plus
vite : on est "en direct" là, et par-dessus une exécution déjà peut-être
longue. J'ai trouvé une méthode supplémentaire pour améliorer la robustesse
du truc : si on est en timeout() sur surligner_mots(), il y a maintenant des
chances pour que le buffer s'affiche quand même. (pas encore testé)

-- Fil

@ Antoine Pitrou <antoine@rezo.net> :

>2) si tu mets #DEBUT_SURLIGNE ou #FIN_SURLIGNE (emboités pas de problèmes,
> même si c'est mal emboité), ça démarre/arrête le surlignement.

Ils vont devenir quoi les #SURLIGNE s'il n'y a pas de recherche ?

rien ou presque;

Virés automatiquement par un filtre temps réel (beuh, et en php3) ?

non non, en php3 ils sont même pas mis dans le fichier cache, tu verras.

-- Fil

Fil wrote:

Il faut qu'elle soit non greedy, car il est indispensable d'aller au plus

Au fait tu avais utilisé [[:alnum:]] : ça existe avec preg_replace ?

>Il faut qu'elle soit non greedy, car il est indispensable d'aller au plus
Au fait tu avais utilisé [[:alnum:]] : ça existe avec preg_replace ?

J'imagine que ça existe, puisque "ça marche"... et que preg est mieux que
ereg (y compris plus rapide)

Tu avais utilisé rawurlencode, mais urlencode est mieux quand tu as des mots
séparés par des esapces : "and spaces encoded as plus (+) signs"

-- Fil

Fil wrote:

J'imagine que ça existe, puisque "ça marche"... et que preg est mieux que
ereg (y compris plus rapide)

Ok.

Tu avais utilisé rawurlencode, mais urlencode est mieux quand tu as des mots
séparés par des esapces : "and spaces encoded as plus (+) signs"

Ouip, c'est parce que rawurlencode est marqué comme RFC-compliant.
Je ne sais pas ce qu'en pensent nos colistiers amateurs de standards....

@ Fil <fil@rezo.net> :

J'ai trouvé une méthode supplémentaire pour améliorer la robustesse
du truc : si on est en timeout() sur surligner_mots(), il y a maintenant des
chances pour que le buffer s'affiche quand même. (pas encore testé)

Eh bien j'ai testé (en ajoutant une boucle infinie dans la fonction de
surlignement) : et ce qui est GÉNIAL c'est que ça marche !!!!! Si la
fonction de surlignement dépasse le temps maximal d'exécution, les données
du buffer ne passent pas par ob_end_clean(), et sont donc flushées par le
serveur avec l'erreur

"Fatal error: Maximum execution time of 2 seconds exceeded in
/var/www/UserDirs/fil/spip/ecrire/inc_surligne.php3 on line 54"

Mais les données sont flushées, donc notre page s'affiche (non surlignée,
évidemment...) jusqu'à la fin du buffer (c-à-dire la fin de l'article...)

Reste à trouver comment neutraliser (à cet endroit précis) l'affichage de
l'erreur timeout(), et on a un truc très robuste.

-- Fil

Fil wrote:

2) si tu mets #DEBUT_SURLIGNE ou #FIN_SURLIGNE (emboités pas de problèmes,
   même si c'est mal emboité), ça démarre/arrête le surlignement.

Avec la compression, ça plante. Sans la compression, ça ne surligne rien
(squelettes par défaut ?).

>2) si tu mets #DEBUT_SURLIGNE ou #FIN_SURLIGNE (emboités pas de problèmes,
> même si c'est mal emboité), ça démarre/arrête le surlignement.

Avec la compression, ça plante.

Zut, j'avais testé avec un brouteur qui ne demandait pas la compression.

Choix rapide : soit on usine à gaz, en ajoutant 'ne pas compresser si
var_recherche'...(une ligne de code), soit on annule tout.

Sans la compression, ça ne surligne rien (squelettes par défaut ?).

Si si, chez moi, avec Internet Explorer 5.1 Mac et avec les squelettes cvs
ça marche
<http://rezo.net/~fil/spip/article.php3?id_article=2333&var_recherche=amnesty>

gasp !

-- Fil

Fil wrote:

Zut, j'avais testé avec un brouteur qui ne demandait pas la compression.

Choix rapide : soit on usine à gaz, en ajoutant 'ne pas compresser si
var_recherche'...(une ligne de code), soit on annule tout.

Y a sûrement une troisième solution, vu qu'on peut imbriquer les
output-buffers. On doit pouvoir adapter le bouzin. Heu, tiens, ce
serait bien de mettre des $GLOBALS autour de 'mode_surligne' et
compagnie, que je me dis.

Si si, chez moi, avec Internet Explorer 5.1 Mac et avec les squelettes cvs
ça marche
<http://rezo.net/~fil/spip/article.php3?id_article=2333&var_recherche=amnesty>

J'ai testé en supprimant le ob_start(ob_gzhandler), vu que j'ai pas de brouteur
ad hoc. Ca veut dire que si on désactive le premier ob_start dans inc_version,
ça fout le machin en l'air.

@ Fil <fil@rezo.net> :

> Avec la compression, ça plante.

Ce code a l'air pourtant de fonctionner :

<?php
    ob_start("gz_handler");
    ob_start("");
    echo "toto";
    $texte = ob_get_contents();
    ob_end_clean();
    echo $texte;
?>

-- Fil

> > Avec la compression, ça plante.

le bug : j'avais oublié d'ouvrir le premier ob_start("") - du coup le
surlignement s'attaquait, en cas de compression, au buffer de compression.
Pas bon !

-- Fil

J'ai testé en supprimant le ob_start(ob_gzhandler), vu que j'ai pas
de brouteur ad hoc. Ca veut dire que si on désactive le premier
ob_start dans inc_version, ça fout le machin en l'air.

Et avec la bidouille que j'avais déjà proposée pour compenser un flux
déjà envoyé "autour" de SPIP sur http://www.lecercle.com/actualites/,
y'a peut-être moyen de corriger le tir, non ?

La revoici, à placer dans 'inc_version.php3' :

if ($use_gz) {
        $alreadySent = ob_get_contents();
        if ($alreadySent == false) $alreadySent = '';
        ob_end_clean();
        ob_start("ob_gzhandler");
        echo $alreadySent;
}

-Nicolas

@ Nicolas Hoizey <nhoizey@phpheaven.net> :

Et avec la bidouille que j'avais déjà proposée pour compenser un flux
déjà envoyé "autour" de SPIP sur http://www.lecercle.com/actualites/,

A quoi ca sert, si les buffers se recouvrent les uns les autres ??

(à condition de ne pas oublier d'en ouvrir autant qu'on en traite...)

-- Fil

Et avec la bidouille que j'avais déjà proposée pour compenser un flux
déjà envoyé "autour" de SPIP sur http://www.lecercle.com/actualites/,

ou alors tu veux dire que tu as un fichier de la forme

XXXXXXXX ob_start(""); XXXXXXXXXXXXX entetes pas spip
<?
    trucs spip
?>
YYYYYYYY $texte = ob_get_contents(); etc.. YYYYYYYYYYY fin pas spip

Alors le ob_get_contents s'attend à recevoir le buffer défini avant l'appel
à spip, mais reçoit en fait celui de compression (et/ou celui de
var_recherche) et donc tout plante. Cette éventualité implique qu'on doit
les fermer si on les a ouverts. C'est ça ?

-- Fil

Et avec la bidouille que j'avais déjà proposée pour compenser un
flux déjà envoyé "autour" de SPIP sur
http://www.lecercle.com/actualites/

ou alors tu veux dire que tu as un fichier de la forme

XXXXXXXX ob_start(""); XXXXXXXXXXXXX entetes pas spip
<?
    trucs spip

?>>

YYYYYYYY $texte = ob_get_contents(); etc.. YYYYYYYYYYY fin pas spip

Alors le ob_get_contents s'attend à recevoir le buffer défini avant
l'appel à spip, mais reçoit en fait celui de compression (et/ou
celui de var_recherche) et donc tout plante. Cette éventualité
implique qu'on doit les fermer si on les a ouverts. C'est ça ?

Ouh la la, c'est compliqué, ce que tu me racontes là ... :wink:

Non, j'ai tout simplement :

<?php
ob_start();
?>
XXXXXXXX
<?php
SPIP
?>
YYYYYYYY

Rien de plus, si je puis dire.

Donc il faut récupérer "XXXXXXXX" dans le buffer pour le remettre dans
celui qui doit être compressé, sinon ça foire.

A priori, mon patch ne gène pas un SPIP "pur", et permet d'utiliser
ob_start dans un script "autour" de SPIP ...

-Nicolas

A quoi ca sert, si les buffers se recouvrent les uns les autres ??

Le problème intervient surtout quand ils ont des handlers différents,
à priori.

-Nicolas

Non, j'ai tout simplement :

<?php
ob_start();
?>
XXXXXXXX
<?php
SPIP
?>
YYYYYYYY

Rien de plus, si je puis dire.

Donc il faut récupérer "XXXXXXXX" dans le buffer pour le remettre dans
celui qui doit être compressé, sinon ça foire.

Qu'est-ce que tu observes ? Je viens de tenter l'expérience en mettant
quelques lignes de texte au-dessus de l'appel à spip dans article.php3, et

1) la compression ne s'active pas, mais ne génère pas d'erreur

2) le header("Vary: Accept-Encoding") (ligne 251 de inc_version) donne une
    erreur ( on peut le neutraliser par un @)

3) Ensuite, j'ai mis un ob_start au-dessus, avant les lignes de texte. Là
   effectivement, en cas de compression c'est la page blanche ; sans
   compression tout fonctionne (y compris var_recherche)

4) Encore après, j'ai ajouté un ob_end_flush() juste avant l'appel à spip.
   De nouveau tout fonctionne parfaitement (toutefois, il n'y a pas de
   compression possible - comme avec ton patch).

Du coup je ne vois pas bien l'utilité de ton patch : il suffit que tu fasses
flush() avant d'appeler spip ? Détrompe-moi ?

[En revanche je vais ajouter le @ devant l'entete "Vary:" - ça permet
d'utiliser spip, certes sans compression, à l'intérieur d'une page où se
trouvent d'autres trucs.]

-- Fil