Listing 2: Second Version of Apache::TagNew
package Apache::TagNew;
use strict;
use Apache::Constants qw(OK DECLINED NOT_FOUND);
sub handler
{
# Get the Apache request object
my $r = shift;
# Only handle text/html files
return DECLINED unless ($r->content_type
eq "text/html");
# Get the file we're trying to send
if (open(FILE, $r->filename))
{
# Send an appropriate MIME header
$r->send_http_header;
# Slurp up files at once
undef $/;
# Grab the file's contents
my ($contents) = (<FILE>);
# Tag hyperlinks as new
$contents =~
s|<a\s+href=['"]?(\S+?)['"]?\s*>([\s\S]+?)</a>
|label_url($r, $1, $2)|eigx;
# Print the contents
$r->print($contents);
# Close the file handle
close FILE;
# Indicate that all went well
return OK;
}
# produce an appropriate error message
else
{
return NOT_FOUND;
}
}
# Subroutine for tagging URLs
sub label_url
{
# Get the URL and the text
my $r = shift;
my $url = shift;
my $text = shift;
my $label;
# If the URL does not begin with "http://",
#then we can assume it
# is on our system
if ($url !~ m|^http://|)
{
# Check the modification date of the file
my $filename = $r->document_root . $url;
my $ctime = -M $filename;
if ($ctime < 7)
{
$label = "<font color=\"red\">New!</font>";
}
}
# Return a value to the caller
return "<a href=\"$url\">$text</a> $label";
}
1;