<?php
/*
Plugin Name: Linkifier
Plugin URI: http://www.wasab.dk/morten/blog/archives/2004/05/30/wordpress-plugin-linkifier
Description: Expand category and link names marked up inside { and } to regular links, based on link URL and URL in category description.
Version: 2.0
Author: Morten Frederiksen
Author URI: http://purl.org/net/morten/

Changes since 1.4:
* Tweaked to also work with WP2.0.

Changes since 1.3:
* Fixed "special" description handling with empty values.

Changes since 1.2:
* Authors now handled as well, including "special" description handling.

Changes since 1.1:
* Now handles description and multiple URIs in category description.

Changes since 1.0:
* Don't warn about link names that start and end with whitespace.

*/


function linkifier_the_content($text) {
    global 
$user_level$authordata;
    global 
$tableusers$tablecategories$wpdb;

    
# Parse text looking for names enclosed in { and }.
    
$linkedtext='';
    foreach (
preg_split('|(\{[^\}\n]+?\})|'$text, -1PREG_SPLIT_DELIM_CAPTURE) as $token) {
        if (
preg_match('|^\{([^\}]+?)\}$|'$token$M)) {
            
$name $M[1];

            
# Look for a category with that name.
            
$categories $wpdb->get_results('SELECT cat_name, category_description FROM '.$tablecategories);
            foreach (
$categories as $cat) {
                if (
$cat->cat_name == $name) {
                    
$lines preg_split('|(\r?\n)+|'$cat->category_description);
                    
$link '';
                    foreach (
$lines as $line) {
                        if (
preg_match('|^(http:\S+)(\s)?(\S.+)?$|'$line$M)) {
                            
$link $M[1];
                            if (
array_key_exists(3$M)) {
                                
$title ' title="' $M[3] . '"';
                                break;
                            }
                            else
                                
$title '';
                        }
                    }
                    if (
'' != $link) {
                        
$linkedtext .= '<a' $title ' href="'htmlspecialchars($link) . '">' $name '</a>';
                        
$name '';
                        break;
                    }
                }
            }

            
# If not found, look for a link with that name or description.
            
if ('' != $name) {
                foreach (
get_linkobjects() as $link) {
                    if (
$link->link_name == $name || $link->link_description == $name) {
                        
$linkedtext .= '<a title="' htmlspecialchars($link->link_name) . '"';
                        if(
$link->link_rel && $authordata->ID == $link->link_owner)
                            
$linkedtext .= ' rel="' $link->link_rel '"';
                        
$linkedtext .= ' href="'htmlspecialchars($link->link_url) . '">' $name '</a>';
                        
$name '';
                        break;
                    }
                }
            }

            
# If not found, look for user with that name.
            
if ('' != $name) {
                list(
$id$key$dummy)=split(':',$name);
                
$query "SELECT * from $tableusers";
                
$authors $wpdb->get_results($query);
                foreach (
$authors as $author) {
                    
$authora=get_object_vars($author);
                    if (
in_array($name$authora) || in_array($id$authora)) {
                        
$tmp_authordata $authordata;
                        
$authordata $author;
                        
$keys split(','$key);
                        
$values = array();
                        foreach (
$keys as $key) {
                            
$value '';
                            if (
''==$key || array_key_exists('user_'.$key$authora)) {
                                if (
''==$key)
                                    
$value trim(stripslashes(the_author(''false)));
                                else
                                    
$value trim(stripslashes($authora['user_'.$key]));
                                if (
'email'==$key)
                                    
$value str_replace('@','(at)',str_replace('.','(dot)',$value));
                                else
                                    
$value '<a href="' get_author_link(0$authordata->ID$authordata->user_nicename) . '" title="' sprintf(__("Posts by %s"), htmlspecialchars(the_author(''false))) . '">' $value '</a>';
                            } elseif (
''!=$key && preg_match('|\s'.preg_quote($key,'|').':[^\n\S]*([^\n]+\S+)|i'$author->user_description$M)) {
                                
$value trim(htmlspecialchars(stripslashes($M[1])));
                            }
                            if (
''!=$value)
                                
$values[]=$value;
                        }
                        
$linkedtext .= join(', ',$values);
                        
$authordata $tmp_authordata;
                        
$name '';
                        break;
                    }
                }
            }

            
# If not found, keep the token.
            
if ('' != $name)
                
$linkedtext .= $token;
        } else
            
$linkedtext .= $token;
    }

    return 
$linkedtext;
}

# Turn on the linkyfying process.
add_filter('the_content''linkifier_the_content');

?>