RecursiveFilterIterator版PINDでSubPathname表示

id:balibali:20080515:1210876616 のつづき。

結果が相対パスじゃなくなっていたので修正。なんか場当たり対応なのでもっと上手く書ける気がする。

@@ -65,18 +65,21 @@
     }

     if ($result) {
-        echo $color->convert("%G{$path}%n\n{$result}\n");
+        $subPath = $iterator->getSubPathname();
+        echo $color->convert("%G{$subPath}%n\n{$result}\n");
     }
 }

 class PindRecursiveFilterIterator extends RecursiveFilterIterator
 {
     private $patterns;
+    private $subPath;

-    function __construct($path, $patterns = array())
+    function __construct($path, $patterns = array(), $subPath = '')
     {
         parent::__construct(new RecursiveDirectoryIterator($path));
         $this->patterns = $patterns;
+        $this->subPath = $subPath;
     }

     function accept()
@@ -104,6 +107,16 @@

     function getChildren()
     {
-        return new PindRecursiveFilterIterator($this->key(), $this->patterns);
+        return new PindRecursiveFilterIterator($this->key(), $this->patterns, $this->getSubPathname());
+    }
+
+    function getSubPathname()
+    {
+        if ($this->subPath) {
+            $subPath = $this->subPath . DIRECTORY_SEPARATOR . $this->getInnerIterator()->getFilename();
+        } else {
+            $subPath = $this->getInnerIterator()->getFilename();
+        }
+        return $subPath;
     }
 }

機能しなくなっていた RecursiveDirectoryIterator::getSubPathname() メソッドをオーバーライドしてなんとか対応(getSubPath() もやれよって感じだがまあ)

あ、待てよ、これって継承してないっぽいからオーバーライドじゃないかも。んんーなんか混乱してきたけど今日は眠いので寝る。