Indentazione automatica file php

Come re-indentare correttamente un file php.

In un recente caso pratico ci è capitato di dover analizzare un file php piuttosto lungo e complesso.
Come problema ulteriore vi era il fatto che l'indentazione non fosse affatto accurata, creando non pochi problemi di interpretazione. Un comando che può risolvere questi casi è il seguente:



cat file.php|sed s/\{/\{\\n/g|sed s/\}/\\n\}/g|sed ':loop;s/^\ //g;t loop'|sed ':loop;s/^\t//g;t loop'|grep -v '^$'|awk '{if ($0 ~/{/ && !($0 ~/{/ && $0 ~/}/)){indenta +=1}; while(spazio<indenta){printf "\t"; spazio += 1} spazio=0; if ($0 ~/}/ || $0 ~/{/){print $0}else{if(indenta > 0){printf " "};print $0}; if ($0 ~/}/ && !($0 ~/{/ && $0 ~/}/)){indenta -=1}}'


Il comando è un po' complesso: comincia con una pre-formattazione grezza, andando a capo dopo ogni parentesi graffa
|sed s/\{/\{\\n/g|sed s/\}/\\n\}/g
prosegue eliminando ogni eventuale spazio o tabulazione all'inizio della riga
|sed ':loop;s/^\ //g;t loop'|sed ':loop;s/^\t//g;t loop'
cancella le righe vuote (questo è piuttosto facoltativo)
|grep -v '^$'
quindi c'è la parte principale, che utilizza il potentissimo awk per ottenere un'indentazione via tabulazioni:
[...] while(spazio<indenta){printf "\t"; [...]
Se preferite indentare con gli spazi è sufficiente sostituire lo "\t" con " ".
L'output può naturalmente essere rediretto verso un file aggiungendo
> newfile.php 
alla fine del comando.

Come al solito, saremmo lieti di analizzare i casi simili che ci voleste sottoporre.

0 commenti:

Posta un commento