web-dev-qa-db-fra.com

Formateur/embellisseur de code php et embellissement php en général

Connaissez-vous de bons outils pour bien formater du code PHP désordonné? De préférence, un script pour Aptana/Eclipse, mais un outil autonome fera aussi.

32
deadprogrammer

PHP Code Beautifier est un outil gratuit et utile qui devrait faire ce que vous voulez, bien que leur page de téléchargement nécessite qu'un compte soit créé.

L'outil a été décliné en 3 versions:

  • Une version graphique permettant de traiter le fichier de manière visuelle.
  • Une version en ligne de commande qui permet d’être mise en batch ou intégrée avec d’autres outils (CVS, Subversion, IDE ...).
  • En tant qu'outil intégré de PHPEdit.

En gros, ça va tourner:

if($code == BAD){$action = REWRITE;}else{$action = KEEP;}
for($i=0; $i<10;$i++){while($j>0){$j++;doCall($i+$j);if($k){$k/=10;}}}

dans

if ($code == BAD) {
    $action = REWRITE;
} else {
    $action = KEEP;
}
for($i = 0; $i < 10;$i++) {
    while ($j > 0) {
        $j++;
        doCall($i + $j);
        if ($k) {
            $k /= 10;
        }
    }
}
11
ConroyP

Eh bien voici mon script très basique et rudimentaire:

#!/usr/bin/php
<?php
class Token {
    public $type;
    public $contents;

    public function __construct($rawToken) {
        if (is_array($rawToken)) {
            $this->type = $rawToken[0];
            $this->contents = $rawToken[1];
        } else {
            $this->type = -1;
            $this->contents = $rawToken;
        }
    }
}

$file = $argv[1];
$code = file_get_contents($file);

$rawTokens = token_get_all($code);
$tokens = array();
foreach ($rawTokens as $rawToken) {
    $tokens[] = new Token($rawToken);
}

function skipWhitespace(&$tokens, &$i) {
    global $lineNo;
    $i++;
    $token = $tokens[$i];
    while ($token->type == T_WHITESPACE) {
        $lineNo += substr($token->contents, "\n");
        $i++;
        $token = $tokens[$i];
    }
}

function nextToken(&$j) {
    global $tokens, $i;
    $j = $i;
    do {
        $j++;
        $token = $tokens[$j];
    } while ($token->type == T_WHITESPACE);
    return $token;
}

$OPERATORS = array('=', '.', '+', '-', '*', '/', '%', '||', '&&', '+=', '-=', '*=', '/=', '.=', '%=', '==', '!=', '<=', '>=', '<', '>', '===', '!==');

$IMPORT_STATEMENTS = array(T_REQUIRE, T_REQUIRE_ONCE, T_INCLUDE, T_INCLUDE_ONCE);

$CONTROL_STRUCTURES = array(T_IF, T_ELSEIF, T_FOREACH, T_FOR, T_WHILE, T_SWITCH, T_ELSE);
$WHITESPACE_BEFORE = array('?', '{', '=>');
$WHITESPACE_AFTER = array(',', '?', '=>');

foreach ($OPERATORS as $op) {
    $WHITESPACE_BEFORE[] = $op;
    $WHITESPACE_AFTER[] = $op;
}

$matchingTernary = false;

// First pass - filter out unwanted tokens
$filteredTokens = array();
for ($i = 0, $n = count($tokens); $i < $n; $i++) {
    $token = $tokens[$i];
    if ($token->contents == '?') {
        $matchingTernary = true;
    }
    if (in_array($token->type, $IMPORT_STATEMENTS) && nextToken($j)->contents == '(') {
        $filteredTokens[] = $token;
        if ($tokens[$i + 1]->type != T_WHITESPACE) {
            $filteredTokens[] = new Token(array(T_WHITESPACE, ' '));
        }
        $i = $j;
        do {
            $i++;
            $token = $tokens[$i];
            if ($token->contents != ')') {
                $filteredTokens[] = $token;
            }
        } while ($token->contents != ')');
    } elseif ($token->type == T_ELSE && nextToken($j)->type == T_IF) {
        $i = $j;
        $filteredTokens[] = new Token(array(T_ELSEIF, 'elseif'));
    } elseif ($token->contents == ':') {
        if ($matchingTernary) {
            $matchingTernary = false;
        } elseif ($tokens[$i - 1]->type == T_WHITESPACE) {
            array_pop($filteredTokens); // Remove whitespace before
        }
        $filteredTokens[] = $token;
    } else {
        $filteredTokens[] = $token;
    }
}
$tokens = $filteredTokens;

function isAssocArrayVariable($offset = 0) {
    global $tokens, $i;
    $j = $i + $offset;
    return $tokens[$j]->type == T_VARIABLE &&
        $tokens[$j + 1]->contents == '[' &&
        $tokens[$j + 2]->type == T_STRING &&
        preg_match('/[a-z_]+/', $tokens[$j + 2]->contents) &&
        $tokens[$j + 3]->contents == ']';
}

// Second pass - add whitespace
$matchingTernary = false;
$doubleQuote = false;
for ($i = 0, $n = count($tokens); $i < $n; $i++) {
    $token = $tokens[$i];
    if ($token->contents == '?') {
        $matchingTernary = true;
    }
    if ($token->contents == '"' && isAssocArrayVariable(1) && $tokens[$i + 5]->contents == '"') {
        /*
         * Handle case where the only thing quoted is the assoc array variable.
         * Eg. "$value[key]"
         */
        $quote = $tokens[$i++]->contents;
        $var = $tokens[$i++]->contents;
        $openSquareBracket = $tokens[$i++]->contents;
        $str = $tokens[$i++]->contents;
        $closeSquareBracket = $tokens[$i++]->contents;
        $quote = $tokens[$i]->contents;        
        echo $var . "['" . $str . "']";
        $doubleQuote = false;
        continue;
    }
    if ($token->contents == '"') {
        $doubleQuote = !$doubleQuote;
    }
    if ($doubleQuote && $token->contents == '"' && isAssocArrayVariable(1)) {
        // don't echo "
    } elseif ($doubleQuote && isAssocArrayVariable()) {
        if ($tokens[$i - 1]->contents != '"') {
            echo '" . ';
        }
        $var = $token->contents;
        $openSquareBracket = $tokens[++$i]->contents;
        $str = $tokens[++$i]->contents;
        $closeSquareBracket = $tokens[++$i]->contents;
        echo $var . "['" . $str . "']";
        if ($tokens[$i + 1]->contents != '"') {
            echo ' . "';
        } else {
            $i++; // process "
            $doubleQuote = false;
        }
    } elseif ($token->type == T_STRING && $tokens[$i - 1]->contents == '[' && $tokens[$i + 1]->contents == ']') {
        if (preg_match('/[a-z_]+/', $token->contents)) {
            echo "'" . $token->contents . "'";
        } else {
            echo $token->contents;
        }
    } elseif ($token->type == T_ENCAPSED_AND_WHITESPACE || $token->type == T_STRING) {
        echo $token->contents;
    } elseif ($token->contents == '-' && in_array($tokens[$i + 1]->type, array(T_LNUMBER, T_DNUMBER))) {
        echo '-';
    } elseif (in_array($token->type, $CONTROL_STRUCTURES)) {
        echo $token->contents;
        if ($tokens[$i + 1]->type != T_WHITESPACE) {
            echo ' ';
        }
    } elseif ($token->contents == '}' && in_array($tokens[$i + 1]->type, $CONTROL_STRUCTURES)) {
        echo '} ';
    } elseif ($token->contents == '=' && $tokens[$i + 1]->contents == '&') {
        if ($tokens[$i - 1]->type != T_WHITESPACE) {
            echo ' ';
        }
        $i++; // match &
        echo '=&';
        if ($tokens[$i + 1]->type != T_WHITESPACE) {
            echo ' ';          
        }
    } elseif ($token->contents == ':' && $matchingTernary) {
        $matchingTernary = false;
        if ($tokens[$i - 1]->type != T_WHITESPACE) {
            echo ' ';
        }
        echo ':';
        if ($tokens[$i + 1]->type != T_WHITESPACE) {
            echo ' ';
        }
    } elseif (in_array($token->contents, $WHITESPACE_BEFORE) && $tokens[$i - 1]->type != T_WHITESPACE &&
        in_array($token->contents, $WHITESPACE_AFTER) && $tokens[$i + 1]->type != T_WHITESPACE) {
        echo ' ' . $token->contents . ' ';
    } elseif (in_array($token->contents, $WHITESPACE_BEFORE) && $tokens[$i - 1]->type != T_WHITESPACE) {
        echo ' ' . $token->contents;
    } elseif (in_array($token->contents, $WHITESPACE_AFTER) && $tokens[$i + 1]->type != T_WHITESPACE) {
        echo $token->contents . ' ';
    } else {
        echo $token->contents;
    }
}
39
grom

http://en.sourceforge.jp/projects/pdt-tools/

^^^ vous donnera un formateur CTRL + SHIFT + F approprié Eclipse/Aptana PHP comme Java.

Voir ici pour l’aide à l’installation.

Eclipse php code formatter

15
Chris

Il existe un module pear qui formate votre code. PHP Beautifier

6
projecktzero

Si vous utilisez Zend Development Environment, vous pouvez utiliser la fonctionnalité Indent Code (Ctrl + Maj + F).

5
Ian P

Voici une classe d'embellisseur de code php (PHP bien sûr):
http://www.codeassembly.com/A-php-code-beautifier-that-works/

et

démo en ligne:

http://www.codeassembly.com/examples/beautifier.php

4
micahwittman

Utilisez NetBeans PHP et appuyez sur alt + shift + f.

4
Stefan Brinkmann

L'environnement de développement Zend est maintenant un plugin Eclipse, vous pourrez peut-être l'exécuter parallèlement à Aptana et utiliser simplement sa fonctionnalité Indent Code. 

Zend Studio

Je n'ai pas encore migré moi-même vers le plugin Eclipse, j'aime tellement le précédent ZDE. Bien que maintenant que j'ai commencé à utiliser Eclipse pour d'autres langues, je suis presque prêt à faire le saut.

3
Adam

La solution la plus simple consiste simplement à utiliser un IDE doté de cette fonctionnalité. Si vous écrivez du code régulièrement dans PHP, laissez simplement tomber $ 60 pour PHPStorm. Vous ne le regretterez pas.

http://www.jetbrains.com/phpstorm/

Il vous permet de formater votre code comme bon vous semble à l’aide d’un simple raccourci clavier au niveau du fichier ou du répertoire, et offre de nombreuses autres fonctionnalités intéressantes.

2
Aaron

Qu'en est-il de celui-ci:

http://universalindent.sourceforge.net/

Il combine un grand nombre de formateurs et génère les scripts dont vous avez besoin pour que vous puissiez les distribuer et que les membres de votre équipe les utilisent avant de les valider la prochaine fois. inutilisable... 

2
SeanJA

phpformatter.com fonctionne mieux

"Ce formateur en ligne gratuit PHP est conçu pour que vous puissiez embellir tout votre script PHP avec le style que vous préférez"

1
vaichidrewar

Notre PHP Formatter formatera votre code de manière fiable. Il utilise un système frontal basé sur un compilateur pour analyser le code afin d'éviter toute interprétation erronée du code. Par conséquent, sa sortie formatée toujours fonctionne.

1
Ira Baxter

Ceci est une excellente question. J'ai une application qui lit JSON et génère des sorties php, html et css. Je lance un programme et génère des dizaines (des centaines?) De fichiers. J'espère que la réponse ici est utile.

J'ai commencé mon projet en utilisant heredocs, des fichiers d'inclusion spéciaux, des méta-caractères, etc., mais cela est rapidement devenu un gâchis. Je voulais une solution autonome qui ne nécessite ni framework ni ide. J'ai donc supprimé tous les fichiers indésirables hérédoc et autres et créé une classe générique de mise en mémoire tampon du texte sans souci de formatage. Tout peut être une ligne pour tout ce qui m'importe. Pour le HTML, je fais tidy () intégré. Pour php, j'utilise phpstylist . phpstylist est plus vieux mais fonctionne toujours bien pour le format php.

Pour configurer les options de phpstylist j'avais utilisé UniversalIndent (mis à jour en janvier 2012) dans Windows gui. 

UniversalStylist répertorie 24 (!) Programmes de formatage (c, php, ruby, html, ...). Il connaît spécifiquement les options de phpstylist et vous donne une actualisation en direct sur un fichier lorsque vous activez et désactivez les options. Très bien. Ensuite, lorsque vous avez votre style, il a une option pour enregistrer les options de ligne de commande et génère un script. Pour certaines options de formatage, vous devrez ajouter des chemins à Perl, python, etc.

Si vous utilisez Windows et que vous voulez essayer phpstylist avec UniversalIndent, ajoutez simplement un répertoire pour php.exe à votre chemin env. J'utilise ampps donc le mien est réglé sur c:\ampps\php.

Il n'a pas été très facile de trouver une bonne solution solide. Je souhaite également savoir ce que font les autres utilisateurs pour un formatage par lots aussi simple que possible des fichiers php/html générés automatiquement à des fins de révision du code et d'archivage.

0
user1501974