Indenter du code Html

Eléphant du PHP | 224 Messages

05 juin 2007, 11:35

Re...
Disons que le code HTML généré doit, selon moi, uniquement être destiné à être envoyé sur le navigateur.

Tout les développeurs peuvent voir le code HTML depuis les sources PHP. C'est donc ici qu'elles doivent être bien formatées.
Ok, sur le principe je suis d'accord avec toi, sauf que, dans la pratique, le code Html se trouve souvent bien éparpillé dans les fichier Php et, même pour certains développeur plus expérimentés que moi, il est parfois difficile de voir exactement le code Html produit par le script rien qu'en regardant son code Php...

Du coup, il est souvent nécessaire de visualiser le code Html sur une sortie de prévisualisation afin de bien comprendre comment est structuré l'ensemble... bref, c'est en tout cas comme-ça que je fonctionne lorsque la structure du code Html n'est pas évidente à première vue...
Sinon, si tu veux indenter le code automatiquement sans te faire chier, tu peux utiliser ob_start() avec une fonction de callback qui détecte les balises et qui indente le code html juste avant l'affichage...
Merci pour cette piste, que je ne connaissais pas...

En fait, si j'ai bien compris, cette fonction met le code généré en cache (ou en tampon), afin de pouvoir faire des traitements avant l'envoi final vers le navigateur, c'est bien ça ?

Si c'est le cas, ça peut en effet être intéressant, mais ça ne résoud pas pour autant le problème de l'indentation en elle-même, ce n'est pas évident d'imaginer une méthode simple et efficace pour indenter le code Html une fois généré, en tout cas pour moi...

Bref, je vais étudier cette piste et voir si elle peut me rendre service...

Merci... à+ :)
Fredo d;o)
"Un pas à la fois me suffit..." (Gandhi)

ViPHP
ViPHP | 5924 Messages

05 juin 2007, 17:26

En fait, si j'ai bien compris, cette fonction met le code généré en cache (ou en tampon), afin de pouvoir faire des traitements avant l'envoi final vers le navigateur, c'est bien ça ?
Oui, en gros, c'est un dispositif qui te permet de gérer le buffer de sortie. Quand tu fais des echo, la plupart du temps, les chaines sont directement envoyées au navigateur. avec ces fonctions, tu peux contrôler le buffer pour faire des modifications sur les chaines avant de les envoyer vers le navigateur, par exemple pour activer la compression.

Pour l'indentation, en fait, c'est vrai que c'est compliqué, puisqu'il faut coder un automate, mais un début d'algorithme serait du genre :

Code : Tout sélectionner

Initialisation : buffer = '' tabs = 0 indent(str) : str = buffer+str buffer = '' i = rechercher dans la chaine str le caractère '<' si on trouve dans la chaine str une chaine vérifiant <machin truc="machin" truc2="machin2"> commencant à la position i et finissant à la position p alors ajouter tabs tabulation à la position i tabs = tabs+1 sinon si on trouve dans la chaine str une chaine vérifiant </machin> commencant à la position i et finissant à la position p alors tabs = tabs-1 ajouter tabs tabulation à la position i sinon si on atteint la fin de la chaine str alors buffer = couper de la position i à la fin de la chaine str finsi retourner str finscript() : retourner buffer
En gros on incrément tabs à chaque balise ouvrante, on le décrémente à chaque balise fermante, et si on tombe sur la fin, on enregistre la fin de la chaine, parce qu'on est peut être tombé sur une balise incomplète, et il suffit ensuite de concaténer avec le reste de la chaine au prochain affichage (on peut déclencher l'affichage périodiquement...). Et à la fin du script, on affiche le buffer.

Mais après selon l'utilisation que l'on fait du buffer, on peut simplifier le truc en considérant qu'on affichera tout en une seule fois, et donc qu'on n'aura jamais une balise coupée, ou ce genre de choses...

ViPHP
ViPHP | 1380 Messages

05 juin 2007, 18:47

Je plussoie Xénon et Zeus. Indenter la sortie html en prod ne sert qu'à consommer du temps CPU, de la mémoire et surtout de la bande passante. Des espaces inutiles, ça pèse son poids.

Vous avez déjà regardé le code html d'une page Google? Tout est sur une seule et (très) longue ligne.

Maintenant si tu te sers de tes pages à des fins pédagogiques, c'est une autre histoire.
ripat

ViPHP
ViPHP | 4674 Messages

05 juin 2007, 18:50

J'ose intervenir. L'avis que je vais développé ci-dessous est le mien, et n'engage que moi.

Déjà un petit détail, mais ça m'énerve tellement que je vais le mettre d'entrer de jeu :
$var = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"'."\n".
       '                      "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">'."\n\n".
       '<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">'."\n".
       '<head>'."\n".
       '  <title>Page principale &mdash; Mon site.</title>'."\n".
       '</head>'."\n".
       '<body>'."\n".
       '  <h1>Titre</h1>'."\n".
       '  <p>Paragraphe.</p>'."\n".
       '</body>'."\n".
       '</html>';
C'est quand même beaucoup plus propre que d'écrire $var à chaque début de lignes ...
Ca fait des caractères en moins, c'est plus beau, c'est plus léger, enfin bref : on n'a que des avantages.

Et c'est beaucoup plus simple d'écrire ton indentation directement comme ça, plutôt qu'avec une fonction ou je ne sais quoi d'autres.

Si tu ne travailles que pour un seul et unique gabarit (template), tu ne te poses la question, sinon ça devient compliqué.

Voilà comment je raisonne :
Quand je construis le site, j'ai une page index.php qui va inclure les autres pages. Le code de la page index.php est indenté à la main (directement dans le code PHP ou alors à travers un gabarit, peu importe). On va appeler pour la suite la balise <_inc>, la balise qui contient la page incluse (ça peut être <body> elle-même, <div> ou autres).

Pour expliquer la suite, on doit d'abord se poser la question : pourquoi on indente le code HTML ? C'est principalement pour ceux qui veulent le lire. Donc la partie la plus important est la balise <_inc> on est bien d'accord. Donc j'écris 1 ou 2 lignes vide après l'ouverture de la balise <_inc>, je remets l'indentation à 0 pour les pages qui sont incluses (dans la balise <_inc> de la page index.php), et je termine par 1 ou 2 lignes vides avant la fermeture de la balise <_inc>.

De cette façon, quand je développe un module, je sais exactement où j'en suis, car je n'ai pas à me soucier de l'indentation de la page index.php. De plus, le code reste très lisible, car la balise <_inc> étant la plus importante, c'est pas mal de remettre l'indentation à 0 surtout si on travaille avec des tabulations et non des espaces (si on est au 17e noeud pour l'inclusion du texte, le nombre d'indentation sera trop élevé, et le code ne sera pas facile à lire).


Ca c'est ma technique. Si tu veux absolument faire un script, tu peux utiliser la méthode développée plus bas. Mais ce n'est pas très malin de développer ton propre script. Pourquoi ? Déjà parce qu'on peut le faire à la main/en dur, et que le résultat est très propre. De plus, utiliser un script juste pour ça, ça va prendre du temps, et de la ressource pour « rien ». Je n'aime pas dire pour « rien », car c'est important pour moi, mais ce n'est pas l'avis général ...

Donc il ne faudrait pas développer ton propre script, mais utiliser un module C de PHP par exemple.
Lequel choisir ? Sablotron le fait très bien. Certes cela concerne XSLT, mais tu peux lui demander d'appliquer une feuille XSLT vide, et il va réécrire (réindenter plutôt) le code pour toi.
Ca reste de la grosse bidouille quand même, mais comme c'est un module écrit en C, ça reste toujours plus rapide que ton propre script PHP. Je précise que Sablotron est installé par défaut sur pratiquement tous les hébergeurs. EasyPHP ne le supporte pas (pour les versions <= 1.8 de sûr, au-dessus, je ne sais pas), mais son installation est rapide et simple.


Je te conseille tout de même d'appliquer ma première méthode, à savoir remettre l'indentation à 0 et l'écrire à la main. C'est celle qui reste la plus « triviale ».

Bonne journée.
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Eléphant du PHP | 224 Messages

05 juin 2007, 23:22

Re...

Merci de vos contributions, je tiens compte de vos remarques et avis, rien n'est arrêté pour l'instant dans mon projet, il y a donc des choses qui vont certainement évoluer, cette question sur l'indentation du code faisant peut-être partie...

Merci... à+ :)
Fredo d;o)
"Un pas à la fois me suffit..." (Gandhi)