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);
}
}
?>
10 mars 2008 à 20:04
10 mars 2008 à 19:05
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 :)
10 mars 2008 à 18:13
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?)
10 mars 2008 à 10:35
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.
5 mars 2008 à 15:35
@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.