4

私は PEAR PHP_Beautifier を使用して、大量のレガシー コードをフォーマットして、配列要素の特定のフォーマットを実現しようとしています。

カスタムフィルターを作成しました:

class PHP_Beautifier_Filter_ArrayIndent extends PHP_Beautifier_Filter
{
    public function t_array($sTag)
    {
        if (($this->oBeaut->getNextTokenContent(1) === '(') &&
            ($this->oBeaut->getNextTokenContent(2) !== ')')) {
            //    Don't use for Array type hinting
            //    Don't use for Empty array definition
            $this->oBeaut->add($sTag);
            $this->oBeaut->addNewlineIndent();
        } elseif ($this->oBeaut->getNextTokenContent(2) !== ')') {
             //    Ensure a space after type hinted array before argument name
             $this->oBeaut->add($sTag . ' ');
        } else {
             //  Empty array definition
             $this->oBeaut->add($sTag);
        }
    }
}

次の形式を取得しようとしています(「配列」と同じ行に開き中括弧を使用):

public function doSomething(array $params = array()) {
    $dummy1 = array();
    $dummy2 = array (
        'Hello' => 'World',
        'Goodnight' => 'Vienna'
    );
}

しかし、私は得ています:

public function doSomething(array $params = array()) {
    $dummy1 = array();
    $dummy2 = array 
    (
        'Hello' => 'World',
        'Goodnight' => 'Vienna'
    );
}

「t_array」の後の次のトークンを変更/抑制したり、フィルター内で左中括弧を処理できるようにスキップしたりする方法はありますか?

4

1 に答える 1

1

この行$this->oBeaut->addNewlineIndent();が新しい行の原因ではありませんか?削除するか、別の方法に変更する必要はありませんか?

提案:

<?php
if (($this->oBeaut->getNextTokenContent(1) === '(') && ($this->oBeaut->getNextTokenContent(2) !== ')')) { 
    $this->oBeaut->add($sTag); 
} elseif ($this->oBeaut->getNextTokenContent(2) !== ')') {
    // Ensure a space after type hinted array before argument name 
    $this->oBeaut->add($sTag . ' '); 
} else {
    // Empty array definition 
    $this->oBeaut->add($sTag); 
}
于 2012-12-29T19:09:06.240 に答える