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 !
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
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.
Ben, heu ! C'est toi qui as dit que je devais repasser derrière pour
faire plus clean
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é)
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.
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.
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.
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 !
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;
}
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 ?
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à ...
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.]