From 1dd4c8a97d9df99985c4c40e13e7cb1f8e94353f Mon Sep 17 00:00:00 2001 From: John Bintz Date: Mon, 1 Feb 2010 22:34:28 -0500 Subject: [PATCH] oh wow, filesystem finding is really working --- classes/ComicPress.inc | 51 +++++---- classes/ComicPressBackend.inc | 2 + .../backends/ComicPressBackendAttachment.inc | 8 +- .../backends/ComicPressBackendFilesystem.inc | 99 ++++++++++++++--- .../backend-filesystem/image-type-holder.inc | 18 +++ .../backend-filesystem/options-admin.inc | 14 ++- test/ComicPressTest.php | 13 +-- ...ComicPressBackendFilesystemFactoryTest.php | 104 ++++++++++++++++-- 8 files changed, 243 insertions(+), 66 deletions(-) diff --git a/classes/ComicPress.inc b/classes/ComicPress.inc index 2cede76..efca825 100644 --- a/classes/ComicPress.inc +++ b/classes/ComicPress.inc @@ -7,34 +7,36 @@ require_once(dirname(__FILE__) . '/ComicPressComicPost.inc'); */ class ComicPress { var $comicpress_options = array( - 'image_types' => array( - 'comic' => array( - 'default' => true, - 'name' => 'Comic', - 'dimensions' => '760x' - ), - 'rss' => array( - 'default' => false, - 'name' => 'RSS', - 'dimensions' => '350x' - ), - 'archive' => array( - 'default' => false, - 'name' => 'Archive', - 'dimensions' => '125x' - ), - 'mini' => array( - 'default' => false, - 'name' => 'Minithumb', - 'dimensions' => '100x' - ), - ), + 'image_types' => array(), 'helpers' => array(), 'storyline_order' => '', 'enabled_backends' => null, 'category_groupings' => array() ); + var $default_image_types = array( + 'comic' => array( + 'default' => true, + 'name' => 'Comic', + 'dimensions' => '760x' + ), + 'rss' => array( + 'default' => false, + 'name' => 'RSS', + 'dimensions' => '350x' + ), + 'archive' => array( + 'default' => false, + 'name' => 'Archive', + 'dimensions' => '125x' + ), + 'mini' => array( + 'default' => false, + 'name' => 'Minithumb', + 'dimensions' => '100x' + ) + ); + var $backends = array(); function &get_instance($force = false) { @@ -56,8 +58,10 @@ class ComicPress { */ function load() { $result = get_option('comicpress-options'); - if (is_array($result)) { + if (!empty($result) && is_array($result)) { $this->comicpress_options = $this->_array_merge_replace_recursive($this->comicpress_options, $result); + } else { + $this->comicpress_options['image_types'] = $this->default_image_types; } } @@ -297,4 +301,3 @@ class ComicPress { } class ComicPressException extends Exception {} - diff --git a/classes/ComicPressBackend.inc b/classes/ComicPressBackend.inc index 9adc790..f30de2f 100644 --- a/classes/ComicPressBackend.inc +++ b/classes/ComicPressBackend.inc @@ -1,6 +1,8 @@ ensure_type($size); $extras = array(); diff --git a/classes/backends/ComicPressBackendAttachment.inc b/classes/backends/ComicPressBackendAttachment.inc index 35abfc3..c6d95f6 100644 --- a/classes/backends/ComicPressBackendAttachment.inc +++ b/classes/backends/ComicPressBackendAttachment.inc @@ -17,12 +17,8 @@ class ComicPressBackendAttachment extends ComicPressBackend { $comicpress = ComicPress::get_instance(); $dims = array(); - if (isset($comicpress->comicpress_options['image_types'])) { - if (isset($comicpress->comicpress_options['image_types'][$size])) { - if (isset($comicpress->comicpress_options['image_types'][$size]['dimensions'])) { - $dims = array_combine(array('width', 'height'), explode("x", $comicpress->comicpress_options['image_types'][$size]['dimensions'])); - } - } + if (isset($comicpress->comicpress_options['image_types'][$size]['dimensions'])) { + $dims = array_combine(array('width', 'height'), explode("x", $comicpress->comicpress_options['image_types'][$size]['dimensions'])); } return $dims; diff --git a/classes/backends/ComicPressBackendFilesystem.inc b/classes/backends/ComicPressBackendFilesystem.inc index a6824fc..720286f 100644 --- a/classes/backends/ComicPressBackendFilesystem.inc +++ b/classes/backends/ComicPressBackendFilesystem.inc @@ -4,7 +4,31 @@ require_once(dirname(__file__) . '/../ComicPressBackend.inc'); class ComicPressBackendFilesystem extends ComicPressBackend { var $search_string = ''; - var $id, $files_by_type = array(); + var $id, $files_by_type = array(), $file_urls_by_type = array(); + var $source_name; + + function __construct() { + parent::__construct(); + $this->source_name = __('Filesystem', 'comicpress'); + } + + function dims($size = null) { + $dims = array(); + + if ($result = getimagesize($this->files_by_type[$this->ensure_type($size)])) { + $dims = array_combine(array('width', 'height'), array_slice($result, 0, 2)); + } + + return $dims; + } + + function url($size = null) { + return $this->file_urls_by_type[$this->ensure_type($size)]; + } + + function file($size = null) { return $this->files_by_type[$this->ensure_type($size)]; } + function alt() {} + function title() {} } class ComicPressBackendFilesystemFactory { @@ -17,11 +41,17 @@ class ComicPressBackendFilesystemFactory { list($all, $post_id, $root) = $matches; if (($result = get_post_meta($post_id, 'backend_filesystem_files_by_type', true)) !== false) { - if (isset($result[$root])) { - $return = new ComicPressBackendFilesystem(); - $return->id = $id; - $return->files_by_type = $result[$root]; - return $return; + if (is_array($result)) { + if (isset($result[0][$root])) { + $return = new ComicPressBackendFilesystem(); + $return->id = $id; + + foreach (array('files_by_type', 'file_urls_by_type') as $index => $name) { + $return->{$name} = $result[$index][$root]; + } + + return $return; + } } } } @@ -29,12 +59,20 @@ class ComicPressBackendFilesystemFactory { } function _get_search_pattern() { + return $this->_get_pattern('search_pattern'); + } + + function _get_url_pattern() { + return $this->_get_pattern('url_pattern'); + } + + function _get_pattern($which) { $comicpress = ComicPress::get_instance(); if (isset( - $comicpress->comicpress_options['backend_options']['filesystem']['search_pattern'] + $comicpress->comicpress_options['backend_options']['filesystem'][$which] )) { - return (string)$comicpress->comicpress_options['backend_options']['filesystem']['search_pattern']; + return (string)$comicpress->comicpress_options['backend_options']['filesystem'][$which]; } return ''; @@ -44,7 +82,7 @@ class ComicPressBackendFilesystemFactory { $return = array(); $comicpress = ComicPress::get_instance(); - $this->search_pattern = $this->_get_search_pattern(); + $this->search_string = $this->_get_search_pattern(); if (isset($comicpress->comicpress_options['image_types'])) { $files = array(); @@ -62,11 +100,15 @@ class ComicPressBackendFilesystemFactory { if (($filename_pattern = $this->has_common_filename_pattern($all_patterns)) !== false) { if (!empty($files)) { $grouped_by_root = $this->group_by_root($filename_pattern, $files); - update_post_meta($post->ID, 'backend_filesystem_files_by_type', $grouped_by_root); + $urls_by_root = $this->get_urls_for_post_roots($grouped_by_root, $post); + + update_post_meta($post->ID, 'backend_filesystem_files_by_type', array($grouped_by_root, $urls_by_root)); foreach ($grouped_by_root as $root => $files_for_root) { $fs = new ComicPressBackendFilesystem(); $fs->id = 'filesystem-' . $post->ID . '-' . $root; $fs->files_by_type = $files_for_root; + $fs->file_urls_by_type = $urls_by_root[$root]; + $return[] = $fs; } } @@ -76,16 +118,15 @@ class ComicPressBackendFilesystemFactory { return $return; } - function process_search_string($post, $type) { + function process_search_string($post, $type, $filename = null) { $this->_searches = array($this->search_string); + $this->_filename = $filename; do { $any_found = false; for ($i = 0; $i < count($this->_searches); ++$i) { $search = $this->_searches[$i]; - if (preg_match('#%([a-z0-9\-]+)%#i', $search, $matches) > 0) { - $any_found = true; - + if (preg_match('#%([a-z0-9-]+?)%#i', $search, $matches) > 0) { $found = false; $parts = explode('-', $matches[1]); foreach (array( @@ -93,6 +134,7 @@ class ComicPressBackendFilesystemFactory { '_replace_' . strtolower($parts[0]) => implode('-', array_slice($parts, 1)) ) as $method => $additional) { if (method_exists($this, $method)) { + $any_found = true; $found = true; $result = $this->{$method}($post, $type, $additional); if ($result !== false) { @@ -119,9 +161,13 @@ class ComicPressBackendFilesystemFactory { } // @codeCoverageIgnoreStart - function _replace_wordpress($post, $type) { return ABSPATH; } + function _replace_wordpress($post, $type) { return untrailingslashit(ABSPATH); } // @codeCoverageIgnoreEnd + function _replace_wordpress_url($post, $type) { return untrailingslashit(get_option('home')); } + + function _replace_filename($post, $type) { return $this->_filename; } + function _replace_type($post, $type) { return $type; } function _replace_upload_path($post, $type) { return get_option('upload_path'); } @@ -132,7 +178,7 @@ class ComicPressBackendFilesystemFactory { if (isset($comicpress->comicpress_options['backend_options']['filesystem']['folders'][$type])) { return $comicpress->comicpress_options['backend_options']['filesystem']['folders'][$type]; } - return false; + return ''; } function _replace_date($post, $type, $additional) { @@ -239,12 +285,29 @@ class ComicPressBackendFilesystemFactory { return $roots; } + + function get_urls_for_post_roots($roots, $post) { + $urls = array(); + + $this->search_string = $this->_get_url_pattern(); + + foreach ($roots as $root => $files) { + $urls[$root] = array(); + foreach ($files as $type => $file) { + $urls[$root][$type] = reset($this->process_search_string($post, $type, basename($file))); + } + } + + return $urls; + } } // @codeCoverageIgnoreStart class ComicPressBackendFilesystemAdmin { function options_admin() { - $pattern = ComicPressBackendFilesystemFactory::_get_search_pattern(); + $factory = new ComicPressBackendFilesystemFactory(); + $filesystem_pattern = $factory->_get_search_pattern(); + $url_pattern = $factory->_get_url_pattern(); include('partials/backend-filesystem/options-admin.inc'); } @@ -274,7 +337,7 @@ class ComicPressBackendFilesystemAdmin { $comicpress->comicpress_options['backend_options']['filesystem'] = array(); } - foreach (array('folders', 'search_pattern') as $valid_field) { + foreach (array('folders', 'search_pattern', 'url_pattern') as $valid_field) { if (is_array($info[$valid_field])) { $comicpress->comicpress_options['backend_options']['filesystem'][$valid_field] = array(); foreach ($info[$valid_field] as $field => $value) { diff --git a/classes/backends/partials/backend-filesystem/image-type-holder.inc b/classes/backends/partials/backend-filesystem/image-type-holder.inc index 1365075..53ed2d3 100644 --- a/classes/backends/partials/backend-filesystem/image-type-holder.inc +++ b/classes/backends/partials/backend-filesystem/image-type-holder.inc @@ -3,5 +3,23 @@
+ search_string = $backend->_get_search_pattern(); + + if (!empty($backend->search_string)) { + $search_paths = $backend->process_search_string((object)array( + 'post_date' => date('Y-m-d H:i:s') + ), $type); ?> +

+ +

+

+ diff --git a/classes/backends/partials/backend-filesystem/options-admin.inc b/classes/backends/partials/backend-filesystem/options-admin.inc index 6fef2d2..87a4e24 100644 --- a/classes/backends/partials/backend-filesystem/options-admin.inc +++ b/classes/backends/partials/backend-filesystem/options-admin.inc @@ -6,20 +6,30 @@ - + + + + + + + + +

- URL Pattern is similar to how WordPress permalinks are constructed:', 'comicpress') ?> + Filesystem and URL Pattern are defined similarly to how WordPress permalinks are constructed:', 'comicpress') ?>

diff --git a/test/ComicPressTest.php b/test/ComicPressTest.php index 9a8421e..c11cf09 100644 --- a/test/ComicPressTest.php +++ b/test/ComicPressTest.php @@ -134,14 +134,7 @@ class ComicPressTest extends PHPUnit_Framework_TestCase { 'dimensions' => '1000x' ) ) - ), '1000x'), - array(array( - 'image_types' => array( - 'comic' => array( - 'test' => 'hello' - ) - ) - ), 'default') + ), '1000x') ); } @@ -150,7 +143,9 @@ class ComicPressTest extends PHPUnit_Framework_TestCase { */ function testLoad($options_array, $expected_dimensions) { update_option('comicpress-options', $options_array); - if ($expected_dimensions == 'default') { $expected_dimensions = $this->cp->comicpress_options['image_types']['comic']['dimensions']; } + if ($expected_dimensions == 'default') { + $expected_dimensions = $this->cp->default_image_types['comic']['dimensions']; + } $this->cp->load(); $this->assertEquals($expected_dimensions, $this->cp->comicpress_options['image_types']['comic']['dimensions']); } diff --git a/test/backends/ComicPressBackendFilesystemFactoryTest.php b/test/backends/ComicPressBackendFilesystemFactoryTest.php index e5526f9..c3d0848 100644 --- a/test/backends/ComicPressBackendFilesystemFactoryTest.php +++ b/test/backends/ComicPressBackendFilesystemFactoryTest.php @@ -19,6 +19,7 @@ class ComicPressBackendFilesystemFactoryTest extends PHPUnit_Framework_TestCase $valid_backend = new ComicPressBackendFilesystem(); $valid_backend->id = 'filesystem-1--test'; $valid_backend->files_by_type = array('comic' => 'comic-file'); + $valid_backend->file_urls_by_type = array('comic' => 'comic-url'); return array( array('blah', false), @@ -35,7 +36,14 @@ class ComicPressBackendFilesystemFactoryTest extends PHPUnit_Framework_TestCase function testGenerateFromID($id, $is_successful) { wp_insert_post((object)array('ID' => 1)); - update_post_meta(1, 'backend_filesystem_files_by_type', array('-test' => array('comic' => 'comic-file'))); + update_post_meta( + 1, + 'backend_filesystem_files_by_type', + array( + array('-test' => array('comic' => 'comic-file')), + array('-test' => array('comic' => 'comic-url')), + ) + ); if ($is_successful) { $return = $is_successful; @@ -58,7 +66,13 @@ class ComicPressBackendFilesystemFactoryTest extends PHPUnit_Framework_TestCase $comicpress->comicpress_options['backend_options']['filesystem']['search_pattern'] = 'test'; - $fs = $this->getMock('ComicPressBackendFilesystemFactory', array('process_search_string', 'find_matching_files', 'group_by_root', 'has_common_filename_pattern')); + $fs = $this->getMock('ComicPressBackendFilesystemFactory', array( + 'process_search_string', + 'find_matching_files', + 'group_by_root', + 'has_common_filename_pattern', + 'get_urls_for_post_roots' + )); $fs->expects($this->at(0))->method('process_search_string')->with($post, 'comic')->will($this->returnValue(array('comic'))); $fs->expects($this->at(1))->method('find_matching_files')->with(array('comic'))->will($this->returnValue(array('comic'))); @@ -74,6 +88,19 @@ class ComicPressBackendFilesystemFactoryTest extends PHPUnit_Framework_TestCase 'rss' => 'rss', ) ))); + $fs->expects($this->at(6))->method('get_urls_for_post_roots')->with( + array( + 'root' => array( + 'comic' => 'comic', + 'rss' => 'rss', + ) + ), $post + )->will($this->returnValue(array( + 'root' => array( + 'comic' => 'comic-url', + 'rss' => 'rss-url', + ) + ))); $return = $fs->generate_from_post($post); @@ -85,9 +112,22 @@ class ComicPressBackendFilesystemFactoryTest extends PHPUnit_Framework_TestCase ), $return[0]->files_by_type); $this->assertEquals(array( - 'root' => array( - 'comic' => 'comic', - 'rss' => 'rss', + 'comic' => 'comic-url', + 'rss' => 'rss-url' + ), $return[0]->file_urls_by_type); + + $this->assertEquals(array( + array( + 'root' => array( + 'comic' => 'comic', + 'rss' => 'rss', + ) + ), + array( + 'root' => array( + 'comic' => 'comic-url', + 'rss' => 'rss-url', + ) ) ), get_post_meta(1, 'backend_filesystem_files_by_type', true)); } @@ -117,7 +157,24 @@ class ComicPressBackendFilesystemFactoryTest extends PHPUnit_Framework_TestCase ), 2 ), - array('%wordpress%/%upload-path%/comic/%date-Y%/%date-Y-m-d%*.jpg', array('/wordpress/upload/comic/2009/2009-01-01*.jpg')), + array( + '%wordpress%/%upload-path%/comic/%date-Y%/%date-Y-m-d%*.jpg', + array( + '/wordpress/upload/comic/2009/2009-01-01*.jpg' + ) + ), + array( + '%wordpress-url%/%type%/%filename%', + array( + 'http://wordpress/comic/filename.jpg' + ) + ), + array( + 'http://cdn.domain.name/%type%/%filename%', + array( + 'http://cdn.domain.name/comic/filename.jpg' + ) + ), ); } @@ -142,6 +199,7 @@ class ComicPressBackendFilesystemFactoryTest extends PHPUnit_Framework_TestCase wp_set_post_categories(2, array(4)); update_option('upload_path', 'upload'); + update_option('home', 'http://wordpress/'); $fs->search_string = $string; @@ -150,7 +208,7 @@ class ComicPressBackendFilesystemFactoryTest extends PHPUnit_Framework_TestCase 'backend_options' => array('filesystem' => array('folders' => array('comic' => 'comic-folder'))) ); - $this->assertEquals($expected_searches, $fs->process_search_string($posts[$post_id_to_use], 'comic')); + $this->assertEquals($expected_searches, $fs->process_search_string($posts[$post_id_to_use], 'comic', 'filename.jpg')); } @@ -303,4 +361,36 @@ class ComicPressBackendFilesystemFactoryTest extends PHPUnit_Framework_TestCase ); $this->assertEquals($expected_result, $this->fa->_replace_type_folder(null, $type)); } + + function testGetURLPattern() { + $comicpress = ComicPress::get_instance(true); + $comicpress->comicpress_options = array( + 'backend_options' => array('filesystem' => array('url_pattern' => 'pattern')) + ); + + $this->assertEquals('pattern', $this->fa->_get_url_pattern()); + } + + function testGetURLsForPostRoots() { + $roots = array( + 'one' => array( + 'comic' => '/this/file1.jpg' + ), + 'two' => array( + 'rss' => '/this/file2.jpg' + ) + ); + + $fa = $this->getMock('ComicPressBackendFilesystemFactory', array('_get_url_pattern')); + $fa->expects($this->any())->method('_get_url_pattern')->will($this->returnValue('test/%type%/%date-Y%/%filename%')); + + $this->assertEquals(array( + 'one' => array( + 'comic' => 'test/comic/2010/file1.jpg' + ), + 'two' => array( + 'rss' => 'test/rss/2010/file2.jpg' + ) + ), $fa->get_urls_for_post_roots($roots, (object)array('post_date' => '2010-01-01'))); + } }