<?php
/*
Plugin Name: the_excerpt Reloaded
Plugin URI: http://guff.szub.net/the-excerpt-reloaded/
Description: This mod of WordPress' template function the_excerpt() knows there is no spoon.
Version: R1
Author: Kaf Oseo
Author URI: http://szub.net

    Copyright (c) 2004, 2005 Kaf Oseo (http://szub.net)
    the_excerpt Reloaded is released under the GNU General Public
    License: http://www.gnu.org/licenses/gpl.txt

    This is a WordPress plugin (http://wordpress.org). WordPress is
    free software; you can redistribute it and/or modify it under the
    terms of the GNU General Public License as published by the Free
    Software Foundation; either version 2 of the License, or (at your
    option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
    General Public License for more details.

    For a copy of the GNU General Public License, write to:

    Free Software Foundation, Inc.
    59 Temple Place, Suite 330
    Boston, MA  02111-1307
    USA

    You can also view a copy of the HTML version of the GNU General
    Public License at http://www.gnu.org/copyleft/gpl.html

~Changelog:
R1  (21-Aug-2005)
Lots of changes and additions. Now a full-blown Release version...

0.3 (20-Apr-2005)
Fixed '...' so it appears when expected; added 'all' argument to
allowedtags parameter (allows all HTML tags); altered filter_type
so if 'content' is the argument, WordPress text formatting occurs
(HTML paragraphs, 'fancy' punctuation, etc).

0.2 (16-Dec-2004)
Plugin now attempts to correct *broken* HTML tags (those allowed
through 'allowedtags') by using WP's balanceTags function.  This
is controlled through the 'fix_tags' parameter.

*/

function wp_the_excerpt_reloaded($args='') {
    
parse_str($args);
    if(!isset(
$excerpt_length)) $excerpt_length 120// length of excerpt in words. -1 to display all excerpt/content
    
if(!isset($allowedtags)) $allowedtags '<a>'// HTML tags allowed in excerpt, 'all' to allow all tags.
    
if(!isset($filter_type)) $filter_type 'none'// format filter used => 'content', 'excerpt', 'content_rss', 'excerpt_rss', 'none'
    
if(!isset($use_more_link)) $use_more_link 1// display
    
if(!isset($more_link_text)) $more_link_text "(more...)";
    if(!isset(
$force_more)) $force_more 1;
    if(!isset(
$fakeit)) $fakeit 1;
    if(!isset(
$fix_tags)) $fix_tags 1;
    if(!isset(
$no_more)) $no_more 0;
    if(!isset(
$more_tag)) $more_tag 'div';
    if(!isset(
$more_link_title)) $more_link_title 'Continue reading this entry';
    if(!isset(
$showdots)) $showdots 1;

    return 
the_excerpt_reloaded($excerpt_length$allowedtags$filter_type$use_more_link$more_link_text$force_more$fakeit$fix_tags$no_more$more_tag$more_link_title$showdots);
}

function 
the_excerpt_reloaded($excerpt_length=120$allowedtags='<a>'$filter_type='none'$use_more_link=true$more_link_text="(more...)"$force_more=true$fakeit=1$fix_tags=true$no_more=false$more_tag='div'$more_link_title='Continue reading this entry'$showdots=true) {
    if(
preg_match('%^content($|_rss)|^excerpt($|_rss)%'$filter_type)) {
        
$filter_type 'the_' $filter_type;
    }
    echo 
get_the_excerpt_reloaded($excerpt_length$allowedtags$filter_type$use_more_link$more_link_text$force_more$fakeit$no_more$more_tag$more_link_title$showdots);
}

function 
get_the_excerpt_reloaded($excerpt_length$allowedtags$filter_type$use_more_link$more_link_text$force_more$fakeit$no_more$more_tag$more_link_title$showdots) {
    global 
$post;

    if (!empty(
$post->post_password)) { // if there's a password
        
if ($_COOKIE['wp-postpass_'.COOKIEHASH] != $post->post_password) { // and it doesn't match cookie
            
if(is_feed()) { // if this runs in a feed
                
$output __('There is no excerpt because this is a protected post.');
            } else {
                
$output get_the_password_form();
            }
        }
        return 
$output;
    }

    if(
$fakeit == 2) { // force content as excerpt
        
$text $post->post_content;
    } elseif(
$fakeit == 1) { // content as excerpt, if no excerpt
        
$text = (empty($post->post_excerpt)) ? $post->post_content $post->post_excerpt;
    } else { 
// excerpt no matter what
        
$text $post->post_excerpt;
    }

    if(
$excerpt_length 0) {
        
$output $text;
    } else {
        if(!
$no_more && strpos($text'<!--more-->')) {
            
$text explode('<!--more-->'$text2);
            
$l count($text[0]);
            
$more_link 1;
        } else {
            
$text explode(' '$text);
            if(
count($text) > $excerpt_length) {
                
$l $excerpt_length;
                
$ellipsis 1;
            } else {
                
$l count($text);
                
$more_link_text '';
                
$ellipsis 0;
            }
        }
        for (
$i=0$i<$l$i++)
                
$output .= $text[$i] . ' ';
    }

    if(
'all' != $allowed_tags) {
        
$output strip_tags($output$allowedtags);
    }

//    $output = str_replace(array("\r\n", "\r", "\n", "  "), " ", $output);

    
$output rtrim($output"\s\n\t\r\0\x0B");
    
$output = ($fix_tags) ? $output balanceTags($output);
    
$output .= ($showdots && $ellipsis) ? '...' '';

    switch(
$more_tag) {
        case(
'div') :
            
$tag 'div';
        break;
        case(
'span') :
            
$tag 'span';
        break;
        case(
'p') :
            
$tag 'p';
        break;
        default :
            
$tag 'span';
    }

    if (
$use_more_link && $more_link_text) {
        if(
$force_more) {
            
$output .= ' <' $tag ' class="more-link"><a href="'get_permalink($post->ID) . '#more-' $post->ID .'" title="' $more_link_title '">' $more_link_text '</a></' $tag '>' "\n";
        } else {
            
$output .= ' <' $tag ' class="more-link"><a href="'get_permalink($post->ID) . '" title="' $more_link_title '">' $more_link_text '</a></' $tag '>' "\n";
        }
    }

    
$output apply_filters($filter_type$output);

    return 
$output;
}
?>