am 16. Oktober 2009
Ich habe das Glück viel mit diversen Werkzeugen in meinem Job rumzuspielen. So durfte ich mich zum Beispiel letzens in den PHP_Beautifier aus dem PEAR Projekt auseinandersetzen. Ich hatte ja schon mal ein paar Worte zu der Verwendung verloren. Leider habe ich es nicht hinbekommen, mit den Regeln, die der Beautifier anbietet unser Regelwerk hier umzusetzen. Was also machen? Neues Tool suchen, hat nicht geklappt, da es in der Hinsicht eigentlich nichts besseres gibt. Also “einfach” erweitern.
Die Filter des Beautifiers sind eigentlich simple aufgebaut. Ich habe eine Methode call, die jedes Token in meinem Source Code durchlaufen muss. Dort kann ich dann den den Content verändern. Ich kann zum Beispiel hinter jedes Plus ein Space einfügen. Zusätzlich habe ich auch die Möglichkeit eine Methode nach einem Token zu benennen und dann direkt auf dieses Token zu reagieren.
class PHP_Beautifier_Filter_SoSomesthingStupid extends PHP_Beautifier_Filter
{
function t_whitespace( $sTag )
{
$this->oBeaut->add($sTag . " /* ein whitepace block */");
}
}
Dieser vollständige Filter würde jeder Leerzeichengruppe einen kleinen Kommentar verpassen. Toll, oder? nein natürlich nicht toll, aber man sieht, dass es doch eigentlich ganz einfach ist. Das oBeat Objekt spiegelt übrigens das Dokument wieder. Habt ihr euch aber wahrscheinlich schon gedacht.
Eine wichtige Anmerkung muss hier noch gemacht werden. Falls es keinen Filter gibt, der ein spezielles Token abarbeitet, so läuft es in den default Filter. Genau das war auch mein Problem. Der default Filter schneidet einfach alle neue Zeilen raus. Das heißt der Code wird kompakt, aber meiner Meinung nach nicht leserlicher. Manchmal verwende ich nämlich Leerzeilen im Blöcke zu gruppieren. Tja dumm gelaufen, dass macht der Beautifier nicht.
function t_whitespace($sTag)
{
if (substr_count($sTag, "\n") >= 2)
{
$this->oBeaut->addNewLineIndent();
}
}
Glücklicherweise funktioniert der Code, den ich geschrieben hab gegen das Problem. Sobald der Whitespace Block mehr als zwei neue Zeilen beeinhaltet, schreibe eine neue Zeile schön eingerückt wieder in den Code, ansonsten werf sie raus. Klappt wunderbar. Warum wir sonst alle Whitespaces rauswerfen, könntet ihr euch jetzt fragen? Ganz einfach. Jedes Token bringt seine eigenen Regeln mit. Ich sage z.B. vor einem Operator und danach kommen Leerzeichen. Da werf ich also vorher alle Leerzeilen weg und schreibe meine zwei hin, die ich benötige. So einfach ist das.
Den Filter müsst ihr dann ürbigens in das <code>filter</code> Verzeichnis des Beautifiers werfen. Und schon könnt ihr ihn auch verwenden.
php_beautifier --filters "KeepOwnNewLines()"
Und schon wieder ein Tool, das wir beherrschen. Fabelhaft. Ich habe übrigens auch einen Filter geschrieben, der mir wunderbar alle Gleichungen so einrückt, dass die Gleichheitszeichen übereinander stehen. Das gleiche für Arrays. Wer Interesse hat, einfach bei mir melden.
Ach ja, den “Einbau” in PDT habe ich auch hinbekommen. Ein STRG-SHIFT-B formatiert mir meinen Code jetzt genau so, wie ich ihn haben will/muss. Wenn übrigens Inetresse besteht, dann kann ich mal einen Filter komplett erklären, so ähnlich wie wir es damals für den CodeSniffer gemacht haben. Denn so soll es ja nur ein kleiner Einblick sein und die Angst davor nehmen, den PHP_Beautifier zu verwenden und zu erweitern.