//
// Note that it's quite possible to slurp up the wrong file if your expressions are too broad.
$comic_filename_filters = array();
$comic_filename_filters['default'] = "{date}*.*";
// load all of the comic & non-comic category information
add_action('init', 'get_all_comic_categories');
add_action('init', 'comicpress_handle_options_changes');
add_action('admin_menu', 'comicpress_add_options_menu');
add_action('admin_notices', 'comicpress_admin_notices');
$__comicpress_notices = array();
function comicpress_add_options_menu() {
add_theme_page(__("ComicPress Config", 'comicpress'), __('ComicPress Config', 'comicpress'), 'edit_themes', basename(__FILE__), 'comicpress_options_menu');
}
function get_first_comic() {
return get_terminal_post_in_category(get_all_comic_categories_as_cat_string());
}
function get_last_comic() {
return get_terminal_post_in_category(get_all_comic_categories_as_cat_string(), false);
}
function comicpress_admin_notices() {
global $__comicpress_notices;
if (!empty($__comicpress_notices) && is_array($__comicpress_notices)) {
echo '
';
foreach ($__comicpress_notices as $notice) { echo '
' . $notice . '
'; }
echo '
';
}
}
function comicpress_handle_options_changes() {
global $__comicpress_notices;
include(get_template_directory() . '/comicpress-config.php');
if (isset($_POST['cp'])) {
if (wp_verify_nonce($_POST['cp']['_nonce'], 'comicpress')) {
foreach ($_POST['cp'] as $field => $value) {
${$field} = $value;
}
$lines = file(get_template_directory() . '/comicpress-config.php', FILE_IGNORE_NEW_LINES);
for ($i = 0, $il = count($lines); $i < $il; ++$i) {
if (preg_match('#\$([^\ ]+)#', $lines[$i], $matches) > 0) {
if (!empty(${$matches[1]})) {
$lines[$i] = "\${$matches[1]} = \"" . ${$matches[1]} . "\";";
}
}
}
if (($fh = fopen(get_template_directory() . '/comicpress-config.php', "w")) !== false) {
foreach ($lines as $line) { fwrite($fh, $line . "\n"); }
fclose($fh);
$__comicpress_notices[] = __('ComicPress options updated.', 'comicpress');
} else {
$__comicpress_notices[] = __("Unable to write file. Check your theme directory's permissions.", 'comicpress');
}
}
}
}
function comicpress_options_menu() {
include(get_template_directory() . '/comicpress-config.php');
$categories = get_all_category_ids();
echo '
';
_e('
ComicPress Config
', 'comicpress');
echo '';
echo '
';
}
/**
* Get the hyperlink to the first comic post in the database.
* @return string The hyperlink to the first comic post, or false.
*/
function get_first_comic_permalink() {
$terminal = get_first_comic();
return !empty($terminal) ? get_permalink($terminal->ID) : false;
}
/**
* Get the hyperlink to the last comic post in the database.
* @return string The hyperlink to the first comic post, or false.
*/
function get_last_comic_permalink() {
$terminal = get_last_comic();
return !empty($terminal) ? get_permalink($terminal->ID) : false;
}
/**
* Given a category ID or an array of category IDs, create an exclusion string that will
* filter out every category but the provided ones.
*/
function get_string_to_exclude_all_but_provided_categories($category) {
$category_ids = array_keys(get_all_category_objects_by_id());
if (!is_array($category)) { $category = array($category); }
return implode(",", array_diff($category_ids, $category));
}
/**
* Get the link to the previous comic from the current one.
*/
function previous_comic_link($format, $link) {
global $non_comic_categories;
previous_post_link($format, $link, false, $non_comic_categories);
}
/**
* Get the link to the next comic from the current one.
*/
function next_comic_link($format, $link) {
global $non_comic_categories;
next_post_link($format, $link, false, $non_comic_categories);
}
/**
* Get the previous comic from the current one.
*/
function get_previous_comic($category = null) { return get_adjacent_comic($category); }
/**
* Get the next comic from the current one.
*/
function get_next_comic($category = null) { return get_adjacent_comic($category, true); }
/**
* Get the adjacent comic from the current one.
* @param int $category The category to use.
* @param boolean $next True if the next chronological comic should be retrieved.
* @return array The WordPress post object for the comic post.
*/
function get_adjacent_comic($category, $next = false) {
global $non_comic_categories;
$categories_to_exclude = $non_comic_categories;
if (!is_null($category)) {
$categories_to_exclude = get_string_to_exclude_all_but_provided_categories($category);
}
return get_adjacent_post(false, $categories_to_exclude, $next);
}
/**
* Find the terminal post in a specific category.
*/
function get_terminal_post_in_category($categoryID, $first = true) {
global $post;
$temp = $wp_query; $wp_query = null;
$sortOrder = $first ? "asc" : "desc";
$terminalComicQuery = new WP_Query(); $terminalComicQuery->query("showposts=1&order=${sortOrder}&cat=${categoryID}");
$terninalPost = false;
if ($terminalComicQuery->have_posts()) {
$terminalPost = reset($terminalComicQuery->posts);
}
$wp_query = null; $wp_query = $temp;
return $terminalPost;
}
/**
* Find a comic file in the filesystem.
* @param string $folder The folder name to search.
* @param string $override_post A WP Post object to use in place of global $post.
* @param string $filter The $comic_filename_filters to use.
* @return string The relative path to the comic file, or false if not found.
*/
function get_comic_path($folder = 'comic', $override_post = null, $filter = 'default') {
global $post, $comic_filename_filters, $comic_folder, $archive_comic_folder, $rss_comic_folder, $comic_pathfinding_errors;
if (isset($comic_filename_filters[$filter])) {
$filter_to_use = $comic_filename_filters[$filter];
} else {
$filter_to_use = '{date}*.*';
}
switch ($folder) {
case "rss": $folder_to_use = $rss_comic_folder; break;
case "archive": $folder_to_use = $archive_comic_folder; break;
case "comic": default: $folder_to_use = $comic_folder; break;
}
$post_to_use = (is_object($override_post)) ? $override_post : $post;
$post_date = mysql2date(CP_DATE_FORMAT, $post_to_use->post_date);
$filter_with_date = str_replace('{date}', $post_date, $filter_to_use);
if (count($results = glob("${folder_to_use}/${filter_with_date}")) > 0) {
return reset($results);
}
$comic_pathfinding_errors[] = sprintf(__("Unable to find the file in the %s folder that matched the pattern %s. Check your WordPress and ComicPress settings.", 'comicpress'), $folder, $filter_with_date);
return false;
}
/**
* Find a comic file in the filesystem and return an absolute URL to that file.
* @param string $folder The folder name to search.
* @param string $override_post A WP Post object to use in place of global $post.
* @param string $filter The $comic_filename_filters to use.
* @return string The absolute URL to the comic file, or false if not found.
*/
function get_comic_url($folder = 'comic', $override_post = null, $filter = 'default') {
if (($result = get_comic_path($folder, $override_post, $filter)) !== false) {
return get_option('home') . '/' . $result;
}
return false;
}
/**
* Turn the tree of comics categories into a string to be fed into wp_query functions.
*/
function get_all_comic_categories_as_cat_string() {
global $all_comic_categories_as_string, $category_tree;
if (empty($all_comic_categories_as_string)) {
$categories = array();
foreach ($category_tree as $node) {
$parts = explode("/", $node);
$categories[] = end($parts);
}
$all_comic_categories_as_string = implode(",", $categories);
}
return $all_comic_categories_as_string;
}
/**
* Turn the list of categories into a hash table of category objects.
*/
function get_all_category_objects_by_id() {
global $categories_by_id;
if (empty($categories_by_id)) {
$categories_by_id = array();
foreach (get_categories("hide_empty=0") as $category_object) {
$categories_by_id[$category_object->term_id] = $category_object;
}
}
return $categories_by_id;
}
/**
* Parse all categories and sort them into comics and non-comics categories.
*/
function get_all_comic_categories() {
global $comiccat, $category_tree, $non_comic_categories;
$categories_by_id = get_all_category_objects_by_id();
foreach (array_keys($categories_by_id) as $category_id) {
$category_tree[] = $categories_by_id[$category_id]->parent . '/' . $category_id;
}
do {
$all_ok = true;
for ($i = 0; $i < count($category_tree); ++$i) {
$current_parts = explode("/", $category_tree[$i]);
if (reset($current_parts) != 0) {
$all_ok = false;
for ($j = 0; $j < count($category_tree); ++$j) {
$j_parts = explode("/", $category_tree[$j]);
if (end($j_parts) == reset($current_parts)) {
$category_tree[$i] = implode("/", array_merge($j_parts, array_slice($current_parts, 1)));
break;
}
}
}
}
} while (!$all_ok);
$non_comic_tree = array();
if (get_option('comicpress-enable-storyline-support') == 1) {
$result = get_option("comicpress-storyline-category-order");
if (!empty($result)) {
$category_tree = explode(",", $result);
}
$non_comic_tree = array_keys($categories_by_id);
foreach ($category_tree as $node) {
$parts = explode("/", $node);
$category_id = end($parts);
if ($parts[1] == $comiccat) {
if (($index = array_search($category_id, $non_comic_tree)) !== false) {
array_splice($non_comic_tree, $index, 1);
}
}
}
} else {
$new_category_tree = array();
foreach ($category_tree as $node) {
$parts = explode("/", $node);
if ($parts[1] == $comiccat) {
$new_category_tree[] = $node;
} else {
$non_comic_tree[] = end($parts);
}
}
$category_tree = $new_category_tree;
}
$non_comic_categories = implode(" and ", $non_comic_tree);
}
/**
* Return true if the current post is in the comics category or a child category.
*/
function in_comic_category() {
global $post, $category_tree;
$comic_categories = array();
foreach ($category_tree as $node) {
$comic_categories[] = end(explode("/", $node));
}
return (count(array_intersect($comic_categories, wp_get_post_categories($post->ID))) > 0);
}
// ComicPress Template Functions
function the_comic($filter = 'default') { echo get_comic_url('comic', null, $filter); }
//The following is deprecated...
function comic_display($filter = 'default') { echo get_comic_url('comic', null, $filter); }
function the_comic_archive($filter = 'default') { echo get_comic_url('archive', null, $filter); }
//The following is deprecated...
function comic_archive($filter = 'default') { echo get_comic_url('archive', null, $filter); }
function the_comic_rss($filter = 'default') { echo get_comic_url('rss', null, $filter); }
//The following is deprecated...
function comic_rss($filter = 'default') { echo get_comic_url('rss', null, $filter); }
/**
* Display the list of Storyline categories.
*/
function comicpress_list_storyline_categories($args = "") {
global $category_tree;
$defaults = array(
'style' => 'list', 'title_li' => __('Storyline')
);
$r = wp_parse_args($args, $defaults);
extract($r);
$categories_by_id = get_all_category_objects_by_id();
$output = '';
if ($style == "list") { $output .= '
", $current_depth);
}
if ($style == "list") { $output .= ""; }
echo $output;
}
/**
* Display text when image (comic) is hovered
* Text is taken from a custom field named "hovertext"
*/
function the_hovertext() {
$hovertext = get_post_meta( get_the_ID(), "hovertext", true );
echo (empty($hovertext)) ? get_the_title() : $hovertext;
}
/**
* Display the comic transcript
* Transcript must be entered into a custom field named "transcript"
* @param string $displaymode, "raw" (straight from the field), "br" (includes html line breaks), "styled" (fully css styled with JavaScript expander)
*/
function the_transcript($displaymode = 'raw') {
$transcript = get_post_meta( get_the_ID(), "transcript", true );
switch ($displaymode) {
case "raw":
echo $transcript;
break;
case "br":
echo nl2br($transcript);
break;
case "styled":
if (!empty($transcript)) { ?>