diff --git a/classes/ComicPress.inc b/classes/ComicPress.inc index 9bcf02e..288ab15 100644 --- a/classes/ComicPress.inc +++ b/classes/ComicPress.inc @@ -143,6 +143,29 @@ class ComicPress { } return array_reverse($all_paths); } + + /** + * Recursively search a particular template directory for a specified file, limiting the search to the provided categories. + * @param string $name The name of the file with no path information. + * @param string $path The path within the template directories to start the search. + * @param attay $categories The child -> root category slugs to search within the specified path. If not provided, retrieve from current post. + * @return string|boolean The path to the file, for false if not found. + */ + function find_file($name, $path, $categories = null) { + foreach (array(get_stylesheet_directory(), get_template_directory()) as $dir) { + $dir = trailingslashit($dir) . $path; + $dirs_to_search = $this->category_search($categories, $dir); + $dirs_to_search[] = $dir; + + foreach ($dirs_to_search as $category_path) { + $target = trailingslashit($category_path) . $name; + if (file_exists($target)) { + return $target; + } + } + } + return false; + } } ?> \ No newline at end of file diff --git a/test/ComicPressTest.php b/test/ComicPressTest.php index 0eae06e..f1bcac6 100644 --- a/test/ComicPressTest.php +++ b/test/ComicPressTest.php @@ -73,6 +73,58 @@ class ComicPressTest extends PHPUnit_Framework_TestCase { $this->assertEquals($found_path, $this->cp->category_search($categories, vfsStream::url('root/style'))); } + + function providerTestFindFile() { + return array( + array( + array(), array(), false, + ), + array( + array('root/parent/partials/index.inc'), array(), vfsStream::url('root/parent/partials/index.inc') + ), + array( + array( + 'root/parent/partials/index.inc', + 'root/child/partials/index.inc' + ), + array(), + vfsStream::url('root/child/partials/index.inc') + ), + array( + array( + 'root/child/partials/index.inc', + 'root/child/partials/comic/index.inc' + ), + array('comic'), + vfsStream::url('root/child/partials/comic/index.inc') + ), + array( + array( + 'root/child/partials/index.inc', + 'root/child/partials/comic/index.inc' + ), + array('chapter-1', 'comic'), + vfsStream::url('root/child/partials/comic/index.inc') + ) + ); + } + + /** + * @dataProvider providerTestFindFile + */ + function testFindFile($files_to_setup, $post_categories, $expected_path_result) { + mkdir(vfsStream::url('root/parent/partials/comic/chapter-1'), 0777, true); + mkdir(vfsStream::url('root/child/partials/comic/chapter-1'), 0777, true); + + foreach ($files_to_setup as $path) { + file_put_contents(vfsStream::url($path), "test"); + } + + _set_template_directory(vfsStream::url('root/parent')); + _set_stylesheet_directory(vfsStream::url('root/child')); + + $this->assertEquals($expected_path_result, $this->cp->find_file('index.inc', 'partials', $post_categories)); + } } ?> \ No newline at end of file