bring in latest comicpress core storyline code
This commit is contained in:
parent
0cb36de9a3
commit
e8cb5a6af3
|
@ -1,8 +1,6 @@
|
|||
<?php
|
||||
|
||||
class ComicPressDBInterface {
|
||||
var $_non_comic_categories = array(), $_all_categories = array();
|
||||
|
||||
function ComicPressDBInterface() {}
|
||||
|
||||
function get_instance() {
|
||||
|
@ -12,75 +10,14 @@ class ComicPressDBInterface {
|
|||
return $instance;
|
||||
}
|
||||
|
||||
function _get_categories() { return get_categories("hide_empty=0"); }
|
||||
|
||||
/**
|
||||
* Set the comic categories for the current run of ComicPress.
|
||||
*/
|
||||
function set_comic_categories($categories) {
|
||||
$this->_all_categories = get_all_category_ids();
|
||||
$this->_non_comic_categories = array_values(array_diff($this->_all_categories, $categories));
|
||||
}
|
||||
|
||||
function _get_categories_to_exclude($category = null) {
|
||||
$result = array_diff($this->_all_categories, array($category));
|
||||
if (is_array($result)) {
|
||||
return (is_null($category)) ? $this->_non_comic_categories : array_values($result);
|
||||
function _get_categories_to_exclude($categories = null) {
|
||||
if (is_array($categories)) {
|
||||
return array_values(array_diff(get_all_category_ids(), $categories));
|
||||
} else {
|
||||
return $this->_non_comic_categories;
|
||||
return array();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Find the terminal post in a specific category.
|
||||
*/
|
||||
function get_terminal_post_in_category($category_id, $first = true) {
|
||||
$this->_prepare_wp_query();
|
||||
|
||||
$sort_order = $first ? "asc" : "desc";
|
||||
$terminal_comic_query = new WP_Query();
|
||||
$terminal_comic_query->query("showposts=1&order=${sort_order}&cat=${category_id}&status=publish");
|
||||
$post = false;
|
||||
if ($terminal_comic_query->have_posts()) {
|
||||
$post = reset($terminal_comic_query->posts);
|
||||
}
|
||||
|
||||
$this->_reset_wp_query();
|
||||
return $post;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the first comic in a category.
|
||||
*/
|
||||
function get_first_comic($category_id) {
|
||||
return $this->get_terminal_post_in_category($category_id);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the last comic in a category.
|
||||
*/
|
||||
function get_last_comic($category_id) {
|
||||
return $this->get_terminal_post_in_category($category_id, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the comic post adjacent to the current comic.
|
||||
* Wrapper around get_adjacent_post(). Don't unit test this method.
|
||||
*/
|
||||
function get_adjacent_comic($category, $next = false, $override_post = null) {
|
||||
global $post;
|
||||
|
||||
$this->_prepare_wp_query();
|
||||
if (!is_null($override_post)) { $temp_post = $post; $post = $override_post; }
|
||||
|
||||
$result = get_adjacent_post(false, implode(" and ", $this->_get_categories_to_exclude($category)), !$next);
|
||||
|
||||
$this->_reset_wp_query();
|
||||
if (!is_null($override_post)) { $post = $temp_post; }
|
||||
|
||||
return empty($result) ? false : $result;
|
||||
}
|
||||
|
||||
function _prepare_wp_query() {
|
||||
global $wp_query;
|
||||
|
||||
|
@ -97,15 +34,74 @@ class ComicPressDBInterface {
|
|||
$wp_query->in_the_loop = $this->in_the_loop;
|
||||
}
|
||||
|
||||
// @codeCoverageIgnoreStart
|
||||
|
||||
/**
|
||||
* Find the terminal post in a specific category.
|
||||
*/
|
||||
function get_terminal_post_in_categories($categories, $first = true) {
|
||||
$this->_prepare_wp_query();
|
||||
|
||||
$sort_order = $first ? "asc" : "desc";
|
||||
$terminal_comic_query = new WP_Query();
|
||||
$terminal_comic_query->query(array(
|
||||
'showposts' => 1,
|
||||
'order' => $sort_order,
|
||||
'category__in' => $categories,
|
||||
'status' => 'publish'
|
||||
));
|
||||
$post = false;
|
||||
if ($terminal_comic_query->have_posts()) {
|
||||
$post = reset($terminal_comic_query->posts);
|
||||
}
|
||||
|
||||
$this->_reset_wp_query();
|
||||
return $post;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the first comic in a category.
|
||||
*/
|
||||
function get_first_post($categories) {
|
||||
return $this->get_terminal_post_in_categories($categories);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the last comic in a category.
|
||||
*/
|
||||
function get_last_post($categories) {
|
||||
return $this->get_terminal_post_in_categories($categories, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the comic post adjacent to the current comic.
|
||||
* Wrapper around get_adjacent_post(). Don't unit test this method.
|
||||
*/
|
||||
function get_adjacent_post($categories, $next = false, $override_post = null) {
|
||||
global $post;
|
||||
|
||||
$this->_prepare_wp_query();
|
||||
if (!is_null($override_post)) { $temp_post = $post; $post = $override_post; }
|
||||
|
||||
$result = get_adjacent_post(false, implode(" and ", $this->_get_categories_to_exclude($categories)), !$next);
|
||||
|
||||
$this->_reset_wp_query();
|
||||
if (!is_null($override_post)) { $post = $temp_post; }
|
||||
|
||||
return empty($result) ? false : $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the previous comic from the current one.
|
||||
*/
|
||||
function get_previous_comic($category = null, $override_post = null) { return $this->get_adjacent_comic($category, false, $override_post); }
|
||||
function get_previous_post($categories = null, $override_post = null) { return $this->get_adjacent_post($categories, false, $override_post); }
|
||||
|
||||
/**
|
||||
* Get the next comic from the current one.
|
||||
*/
|
||||
function get_next_comic($category = null, $override_post = null) { return $this->get_adjacent_comic($category, true, $override_post); }
|
||||
function get_next_post($categories = null, $override_post = null) { return $this->get_adjacent_post($categories, true, $override_post); }
|
||||
|
||||
// @codeCoverageIgnoreEnd
|
||||
}
|
||||
|
||||
?>
|
||||
|
|
|
@ -4,12 +4,14 @@ require_once('ComicPressStoryline.inc');
|
|||
require_once('ComicPressDBInterface.inc');
|
||||
|
||||
class ComicPressNavigation {
|
||||
// @codeCoverageIgnoreStart
|
||||
function init($storyline) {
|
||||
$this->_storyline = $storyline;
|
||||
$this->_dbi = ComicPressDBInterface::get_instance();
|
||||
}
|
||||
// @codeCoverageIgnoreEnd
|
||||
|
||||
function get_post_nav($post) {
|
||||
function get_post_nav($post, $restrictions = null) {
|
||||
$nav = array();
|
||||
if (is_object($post)) {
|
||||
if (isset($post->ID)) {
|
||||
|
@ -17,18 +19,21 @@ class ComicPressNavigation {
|
|||
|
||||
if (($result = wp_cache_get($cache_key, 'comicpress')) !== false) {
|
||||
foreach ($result as $key => $post_id) {
|
||||
$nev[$key] = get_post($post_id);
|
||||
$nav[$key] = get_post($post_id);
|
||||
}
|
||||
return $nav;
|
||||
}
|
||||
|
||||
$categories = $this->_storyline->build_from_restrictions($restrictions);
|
||||
|
||||
// global previous/next
|
||||
foreach (array('previous', 'next') as $field) {
|
||||
$nav[$field] = $this->_dbi->{"get_${field}_comic"}(null, $post);
|
||||
$nav[$field] = $this->_dbi->{"get_${field}_comic"}($categories, $post);
|
||||
}
|
||||
|
||||
// global first/last
|
||||
foreach (array('first', 'last') as $field) {
|
||||
$nav[$field] = $this->_dbi->{"get_${field}_comic"}(null);
|
||||
$nav[$field] = $this->_dbi->{"get_${field}_comic"}($categories);
|
||||
}
|
||||
|
||||
if ($category = $this->_storyline->get_valid_post_category($post->ID)) {
|
||||
|
@ -54,7 +59,6 @@ class ComicPressNavigation {
|
|||
$cache_data = array();
|
||||
foreach ($nav as $key => $output_post) {
|
||||
if (!empty($output_post)) { $cache_data[$key] = $output_post->ID; }
|
||||
if ($output_post->ID == $post->ID) { $nav[$key] = false; }
|
||||
}
|
||||
|
||||
wp_cache_set($cache_key, $cache_data, 'comicpress');
|
||||
|
@ -62,6 +66,7 @@ class ComicPressNavigation {
|
|||
return $nav;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -16,7 +16,10 @@ class ComicPressStoryline {
|
|||
*/
|
||||
function get_flattened_storyline() {
|
||||
$comicpress = &ComicPress::get_instance();
|
||||
return $comicpress->comicpress_options['storyline_order'];
|
||||
if (isset($comicpress->comicpress_options['storyline_order'])) {
|
||||
return $comicpress->comicpress_options['storyline_order'];
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -46,28 +49,37 @@ class ComicPressStoryline {
|
|||
}
|
||||
}
|
||||
|
||||
function _create_structure_key($input) {
|
||||
$key = 'storyline-structure-';
|
||||
if (is_string($input)) { return $key . $input; }
|
||||
if (is_array($input)) {
|
||||
$fixed_parts = array();
|
||||
foreach ($input as $i) { if (is_string($i)) { $fixed_parts[] = $i; } }
|
||||
if (!empty($fixed_parts)) { return $key . implode(',', $fixed_parts); }
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a searchable structure from a node list.
|
||||
* @param array $structure The structure to process.
|
||||
* @return boolean True if the structure was valid.
|
||||
*/
|
||||
function create_structure($structure) {
|
||||
$key = null;
|
||||
if (is_string($structure)) {
|
||||
$key = $structure;
|
||||
$structure = explode(',', $structure);
|
||||
} else {
|
||||
if (is_array($structure)) {
|
||||
$fixed_structure = array();
|
||||
foreach ($structure as $s) {
|
||||
if (!is_array($s)) { $fixed_structure[] = $s; }
|
||||
}
|
||||
$key = implode(',', $fixed_structure);
|
||||
}
|
||||
}
|
||||
$key = $this->_create_structure_key($structure);
|
||||
|
||||
if (!is_null($key)) {
|
||||
$key = "storyline-structure-${key}";
|
||||
if ($key !== false) {
|
||||
if (is_string($structure)) {
|
||||
$structure = explode(',', $structure);
|
||||
} else {
|
||||
if (is_array($structure)) {
|
||||
$fixed_structure = array();
|
||||
foreach ($structure as $s) {
|
||||
if (!is_array($s)) { $fixed_structure[] = $s; }
|
||||
}
|
||||
$structure = $fixed_structure;
|
||||
}
|
||||
}
|
||||
|
||||
if (($result = wp_cache_get($key, 'comicpress')) !== false) {
|
||||
$this->_structure = $result;
|
||||
|
@ -133,6 +145,7 @@ class ComicPressStoryline {
|
|||
|
||||
function _get_field($field, $id) {
|
||||
if (isset($this->_structure)) {
|
||||
$id = $this->_ensure_numeric_category($id);
|
||||
if (isset($this->_structure[$id])) {
|
||||
if (isset($this->_structure[$id][$field])) {
|
||||
return $this->_structure[$id][$field];
|
||||
|
@ -142,11 +155,15 @@ class ComicPressStoryline {
|
|||
return false;
|
||||
}
|
||||
|
||||
// @codeCoverageIgnoreStart
|
||||
function parent($id) { return $this->_get_field('parent', $id); }
|
||||
function previous($id) { return $this->_get_field('previous', $id); }
|
||||
function next($id) { return $this->_get_field('next', $id); }
|
||||
function valid($id) {
|
||||
if (isset($this->_structure[$id])) {
|
||||
// @codeCoverageIgnoreEnd
|
||||
|
||||
function valid($id) {
|
||||
$id = $this->_ensure_numeric_category($id);
|
||||
if (isset($this->_structure[$id])) {
|
||||
return array_keys($this->_structure[$id]);
|
||||
}
|
||||
return false;
|
||||
|
@ -156,16 +173,21 @@ class ComicPressStoryline {
|
|||
if (isset($this->_structure[$id])) {
|
||||
$all_adjacent = array();
|
||||
do {
|
||||
$new_id = $this->_structure[$id][$direction];
|
||||
|
||||
$has_adjacent = false;
|
||||
if (!in_array($new_id, $all_adjacent)) {
|
||||
if ($has_adjacent = isset($this->_structure[$id][$direction])) {
|
||||
$all_adjacent[] = $new_id;
|
||||
$id = $new_id;
|
||||
|
||||
if (isset($this->_structure[$id][$direction])) {
|
||||
$new_id = $this->_structure[$id][$direction];
|
||||
|
||||
if (!in_array($new_id, $all_adjacent)) {
|
||||
if ($has_adjacent = isset($this->_structure[$id][$direction])) {
|
||||
$all_adjacent[] = $new_id;
|
||||
$id = $new_id;
|
||||
}
|
||||
}
|
||||
}
|
||||
// @codeCoverageIgnoreStart
|
||||
} while ($has_adjacent);
|
||||
// @codeCoverageIgnoreEnd
|
||||
return $all_adjacent;
|
||||
}
|
||||
return false;
|
||||
|
@ -197,14 +219,6 @@ class ComicPressStoryline {
|
|||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all comic categories.
|
||||
* @deprecated
|
||||
*/
|
||||
function get_comic_categories() {
|
||||
return array_keys($this->_structure);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a simple storyline.
|
||||
*/
|
||||
|
@ -248,9 +262,11 @@ class ComicPressStoryline {
|
|||
/**
|
||||
* Get a flattened category node list.
|
||||
*/
|
||||
// @codeCoverageIgnoreStart
|
||||
function get_category_flattened($parent = null) {
|
||||
return $this->flatten_simple_storyline($this->get_category_simple_structure($parent));
|
||||
}
|
||||
// @codeCoverageIgnoreEnd
|
||||
|
||||
/**
|
||||
* Merge a flat simple storyline into a tree.
|
||||
|
@ -290,7 +306,6 @@ class ComicPressStoryline {
|
|||
* Integrates a bunch of other things.
|
||||
*/
|
||||
function normalize($flattened_storyline = null, $set = true) {
|
||||
$comicpress = ComicPress::get_instance();
|
||||
if (is_null($flattened_storyline)) {
|
||||
$flattened_storyline = $this->get_flattened_storyline();
|
||||
}
|
||||
|
@ -400,7 +415,7 @@ class ComicPressStoryline {
|
|||
return $this;
|
||||
}
|
||||
|
||||
function _find_children($parent) {
|
||||
function _ensure_numeric_category($parent) {
|
||||
if (!is_numeric($parent)) {
|
||||
foreach (get_all_category_ids() as $id) {
|
||||
$category = get_category($id);
|
||||
|
@ -409,21 +424,30 @@ class ComicPressStoryline {
|
|||
}
|
||||
}
|
||||
}
|
||||
return $parent;
|
||||
}
|
||||
|
||||
function _find_children($parent) {
|
||||
$parent = $this->_ensure_numeric_category($parent);
|
||||
if (is_numeric($parent)) {
|
||||
$children = array($parent);
|
||||
do {
|
||||
$found_children = false;
|
||||
foreach ($this->_structure as $category_id => $info) {
|
||||
if (!in_array($category_id, $children)) {
|
||||
if (isset($info['parent'])) {
|
||||
if (in_array($info['parent'], $children)) {
|
||||
$children[] = $category_id;
|
||||
$found_children = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (is_array($this->_structure)) {
|
||||
foreach ($this->_structure as $category_id => $info) {
|
||||
if (!in_array($category_id, $children)) {
|
||||
if (isset($info['parent'])) {
|
||||
if (in_array($info['parent'], $children)) {
|
||||
$children[] = $category_id;
|
||||
$found_children = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// @codeCoverageIgnoreStart
|
||||
} while ($found_children);
|
||||
// @codeCoverageIgnoreEnd
|
||||
|
||||
return $children;
|
||||
}
|
||||
|
@ -545,38 +569,50 @@ class ComicPressStoryline {
|
|||
}
|
||||
|
||||
if (!$include_all) {
|
||||
foreach ($restrictions as $type => $list) {
|
||||
if (substr($type, 0, 1) == "!") {
|
||||
$method_root = 'exclude';
|
||||
$method_type = substr($type, 1);
|
||||
foreach ($restrictions as $_type => $_list) {
|
||||
if (!is_string($_type) && is_array($_list)) {
|
||||
$all_checks = array($_list);
|
||||
} else {
|
||||
$method_root = 'include';
|
||||
$method_type = $type;
|
||||
$all_checks = array(
|
||||
array($_type, $_list)
|
||||
);
|
||||
}
|
||||
|
||||
if (!is_array($list)) { $list = array($list); }
|
||||
foreach ($all_checks as $info) {
|
||||
list($type, $list) = $info;
|
||||
|
||||
foreach ($list as $restriction) {
|
||||
$method = '';
|
||||
$args = array($restriction);
|
||||
switch ($method_type) {
|
||||
case 'child_of': $method = 'children'; break;
|
||||
case 'root_of': $method = 'post_root'; break;
|
||||
case 'from_post': $method = 'post_category'; break;
|
||||
case 'previous':
|
||||
$method = 'adjacent';
|
||||
$args[] = false;
|
||||
break;
|
||||
case 'next':
|
||||
$method = 'adjacent';
|
||||
$args[] = true;
|
||||
break;
|
||||
default:
|
||||
$method = $method_type; break;
|
||||
if (substr($type, 0, 1) == "!") {
|
||||
$method_root = 'exclude';
|
||||
$method_type = substr($type, 1);
|
||||
} else {
|
||||
$method_root = 'include';
|
||||
$method_type = $type;
|
||||
}
|
||||
if (!empty($method)) {
|
||||
array_unshift($args, "_find_${method}");
|
||||
call_user_func_array(array($this, "_${method_root}"), $args);
|
||||
|
||||
if (!is_array($list)) { $list = array($list); }
|
||||
|
||||
foreach ($list as $restriction) {
|
||||
$method = '';
|
||||
$args = array($restriction);
|
||||
switch ($method_type) {
|
||||
case 'child_of': $method = 'children'; break;
|
||||
case 'root_of': $method = 'post_root'; break;
|
||||
case 'from_post': $method = 'post_category'; break;
|
||||
case 'previous':
|
||||
$method = 'adjacent';
|
||||
$args[] = false;
|
||||
break;
|
||||
case 'next':
|
||||
$method = 'adjacent';
|
||||
$args[] = true;
|
||||
break;
|
||||
default:
|
||||
$method = $method_type; break;
|
||||
}
|
||||
if (!empty($method)) {
|
||||
array_unshift($args, "_find_${method}");
|
||||
call_user_func_array(array($this, "_${method_root}"), $args);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue