Phpcode indenter

Soyez le premier à donner votre avis sur cette source.

Vue 6 973 fois - Téléchargée 194 fois

Description

avec cette classe vous pouvez mettre en forme(indenter) n'importe quel script php, pour que ça soit lisible :)
pour l'utiliser c'est très simple :)
pour utiliser cette classe :
<?php
require 'indenter.class.php';
$test=new indenter;
$test->indent('','mon_fichier.php');
?>
apres avoir créé une instance de la classe "indenter" vous appelez la méthodes "indent()" qui accepte deux paramètres la directoire et le nom du fichier à indenter

merci

Source / Exemple :


<?php
/**

  • @author: AMEZGHAL abdelilah <amezghal@msn.com>
  • /
class Indenter { public function __construct(){ } private $is_string1 = false; private $is_string2 = false; private $is_comment1 = false; private $is_comment2 = false; public function valid(){ return ( $this->is_string1 == false && $this->is_string2 == false && $this->is_comment1 == false && $this->is_comment2 == false ); } public function indent($dir, $file){ $string=trim(file_get_contents($dir.$file)); if(substr($string,0,5)=='<?php'){ $string=substr($string,5,strlen($string)-7); }else{ $string=substr($string,2,strlen($string)-4); } $out = "<?php\n"; $arc = 0; $semilicon = false; $space = true; $tab=''; $is_condition = false; $update=true; for($i = 0; $i < strlen( $string ); $i++) { $char = substr($string, $i, 1); switch($char) { case '"': if($this->is_comment1 == false && $this->is_comment2 == false) { if($this->is_string1) { if(substr($string,$i-1,1)!='\\') { $this->is_string1=false; } }else{ if($this->is_string2==false){ $this->is_string1=true; } } } $out .= $char; break; case '\'': if($this->is_comment1 == false && $this->is_comment2 == false) { if($this->is_string2) { if(substr($string,$i-1,1)!='\\'){ $this->is_string2=false; } }else{ if($this->is_string1==false){ $this->is_string2=true; } } } $out .= $char; break; case '/': if($this->is_string1 == false && $this->is_string2 == false) { if(substr($string, $i-1, 1)=='/'){ $this->is_comment1=true; $semilicon=false; } if($this->is_comment2){ if(substr($string, $i-1, 1)=='*'){ $this->is_comment2=false; $out .= $char."\n".$tab; $update=false; } } } if($update) { $out .= $char; }else{ $update = true; } break; case '*': if($this->valid()) { if(substr($string,$i-1,1)=='/'){ $this->is_comment2=true; $out = substr($out,0,strlen($out)-1); $out .=$tab.'/*'; } }else{ $out .= $char; } break; case '(': if($this->valid()) { $arc++; if($is_condition==false) { $is_condition=true; } } $out .= $char; break; case ')': if($this->valid()) { $arc--; if($arc==0){ $is_condition=false; } } $out .= $char; break; case ';': if($this->valid()) { if($is_condition){ $out .= $char.' '; $space = false; }else{ $semilicon = true; $out .= $char; } }else{ $out .= $char; } break; case '{': if($this->valid()) { $out .= "\n" . $tab . $char . "\n"; $tab .= "\t"; $out .= $tab; }else{ $out .= $char; } break; case '}': if($this->valid()) { $tab = substr($tab, 0, strlen($tab)-1); $out .="\n".$tab.$char."\n"; }else{ $out .= $char; } break; case ':': if($this->valid()) { $out .= $char."\n".$tab; } break; case "\n": if($this->is_comment1){ $out .= $char.$tab;; $this->is_comment1=false; }elseif($this->is_comment2){ $out .= $char.$tab; } break; case "\r": case "\t": if($this->is_string1==true || $this->is_string2==true) { $out .= $char; } break; case ' ': if($this->valid()) { if($space) { $out .= $char; $space = false; } }else{ $out .= $char; } break; default: $space=true; if($semilicon) { $out .= "\n".$tab.$char; $semilicon = false; } else { $out .= $char; } } } $out."\n?>"; file_put_contents($dir.'back_'.$file, $out); } } ?>

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

BaFM
Messages postés
64
Date d'inscription
mercredi 24 juillet 2002
Statut
Membre
Dernière intervention
26 novembre 2009
-
Le Lexer (analyseur lexical) il ne produit pas de code, il produit un flux de jetons qui sont utilisés par un Parser (analyseur syntaxique) qui produit un arbre AST. C'est cet arbre que tu retransformera en chaîne pour le formatage.
amezghal
Messages postés
386
Date d'inscription
lundi 27 février 2006
Statut
Membre
Dernière intervention
21 août 2015
1 -
salut, et merci =),
en fait j'avais pas fais attention au cas de heredoc..donc merci pour la remarque,(bug fix dans la prochaine maj :D)

@BaFm, si tu connais un lexer qui produit du code pour php je serais pronneur...(car je connais que ceux qui produisent du code pour C, C++, C#, java),

merci :)
Eregon
Messages postés
17
Date d'inscription
lundi 3 septembre 2007
Statut
Membre
Dernière intervention
26 octobre 2009
-
Moi je dit vive l'indent personnel^^
Car il y a toujours des exceptions, genre des conditions qu'on veux à peine mentionner et qu'on met sur une ligne, un texte que l'on met directement contre le bord(toujours le cas en heredoc), un saut à la ligne pour repérer des CR ou LF, une arborescence où l'on veut l'élément racine contre la marge, ...

Mais sinon ça doit surement être un bon exercice de parsing :p
Bon codage
P.S.:'deux paramètres la directoire et le nom du fichier' -> '2 paramètres : le dossier et le fichier' ;) (pourquoi séparer ces paramètres?)
BaFM
Messages postés
64
Date d'inscription
mercredi 24 juillet 2002
Statut
Membre
Dernière intervention
26 novembre 2009
-
Bonjour,

Votre code ne gère pas la syntaxe HereDoc supportée par php.

Une méthode plus propre est d'utiliser lexer et parser pour régénérer le code indenté en gérant complètement la grammaire du langage, ce qui évite de tomber dans des cas limites.
amezghal
Messages postés
386
Date d'inscription
lundi 27 février 2006
Statut
Membre
Dernière intervention
21 août 2015
1 -
salut et merci
@Mizuka:
le fonctionnement est très simple, une boucle sur tous les char du script puis un switch suivant les cas, par exemple si c'est un '{' ça nécessite un retour a la ligne puis une tabulation pour ce qui suis ';' retour à la ligne....ainsi de suite
je crois que mes var sont explicites! sinon
$is_string1; pas une chaine du type "string"
$is_string2: pas une chaine du type 'string'
deux type de commentaire //comment et /*comment */
voilà :)

@jlf5808
relis la description j'ai expliqué comment faire :)

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.