Facebook
Twitter
Google+
Kommentare
16

PHP_Beautifier – Eigene Filter schreiben

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.

Über den Autor

Nils Langner

Nils Langner ist der Gründer von "the web hates me" und auch der Hauptautor. Im wahren Leben leitet er das Qualitätsmanagementteam im Gruner+Jahr-Digitalbereich und ist somit für Seiten wie stern.de, eltern.de und gala.de aus Qualitätssicht verantwortlich. Nils schreibt seit den Anfängen von phphatesme, welches er ebenfalls gegründet hat, nicht nur für diverse Blogs, sondern auch für Fachmagazine, wie das PHP Magazin, die t3n, die c't oder die iX. Nebenbei ist er noch ein gern gesehener Sprecher auf Konferenzen. Herr Langner schreibt die Texte über sich gerne in der dritten Form.
Kommentare

16 Comments

  1. Aha, jetzt ist es mir doch schon viel verständlicher 😀
    Hab da aber doch noch zwei Fragen:

    1. Wo kommt der oben geschriebene PHP-Code hin?
    2. Wie installiere ich PHP_Beauttifier auf Windows?

    Vielen Dank für deine Hilfe…

    Reply
  2. Das mit der integration in PDT als Step-By-Step wäre schon sehr schön… denn auch nach einigen Versuchen habe ich den Beautifier mit PDT leider nicht zum laufen gebraucht. Und dann hätte ich endlich eine Alternative zum Zend Studio… 😉

    Reply
  3. Hi, wäre schön, wenn du erklärst, wie die Formattierung in Eclipse einzubinden ist.
    Habt ihr irgendwo ein Filter zum Zend Coding Standard gesehen?

    Grüße
    Philip

    Reply
  4. @Philip: Es gibt soviel ich weiß nur einen Coding Standard für PEAR. Wenn du einen erstellen willst, dann kann ich dir gerne meine Hilfe anbieten.
    Die Geschichte mit dem PDT und Beautifier kommt ganz bald. Versprochen.

    Reply
  5. @Nils … Für die Integrations ins PDT würde ich mcih auch brennend interessieren, da genau das gerade meine Aufgabe ist … Als External Tool läuft es bereits, nur kann ich es so nicht an Tastenkombinationen binden … Für einen kleinen Tip wäre ich sehr dankbar … 🙂

    Grüße,
    Markus

    Reply
  6. Hi,

    wäre es grundsätzlich möglich den Zend Sniffer, anhand des PHP_Beautifier umsetzten zu lassen. D.h. suche alle Warnings und Errors und korrigiere sie dann auch?

    Gruß

    Mamali

    Reply
  7. @Nils: danke für die schnelle Antwort. Ich frag mich nur wie ich das machen könnte. Müsste ich dem Fall statt dem PHP_CodeSniffer_Sniffer Interface, PHP_Beautifier_Filter
    implementieren?

    Reply
  8. @Nils:
    Könntest du mal beschreiben, wie du den Beautifier in Eclipse integriert hast? Ich bekomme es irgendwie nicht hin nen Shortcut zu setzen. Bis jetzt läuft das Ganze nur als externes Tool.. Ich hoffe du kannst mir da ein wenig helfen.

    Liebe Grüße
    Henning

    Reply
  9. Ist jetzt vielleicht ein bisschen spät für meinen Kommentar, aber wo steht denn nun wie man ihn in Eclipse PDT einbindet und den Zend Framework Coding Standard nutzt?

    Reply

Leave a Comment.

Link erfolgreich vorgeschlagen.

Vielen Dank, dass du einen Link vorgeschlagen hast. Wir werden ihn sobald wie möglich prüfen. Schließen