Stories
Slash Boxes
Comments
NOTE: use Perl; is on undef hiatus. You can read content, but you can't post it. More info will be forthcoming forthcomingly.

All the Perl that's Practical to Extract and Report

use Perl Log In

Log In

[ Create a new account ]

Journal of LTjake (4001)

Wednesday June 04, 2003
07:11 AM

$rss->as_javascript

[ #12614 ]

One of the benefits of RSS that I tried to convey to others in the office is the fact that anyone can take our feeds and parse them - thus an extra "broadcast" method. This is fine for people with some programming knowledge, or perhaps their CMS, aggregator, or whatever has the ability to parse RSS. For those people who just have plain old HTML pages the only way to include a feed seems to be through a javascript include:

<script language="JavaScript" src="http://host.com/feeds/myfeed.js"></script>
<noscript><a href="http://host.com/">My Feed Thing</a><noscript>

The only downside is that if javascript is disabled, you'll only get a link rather than the feed.

Since I'm using XML::RSS to construct a feed, i subclassed it and added two new output methods as_javascript and save_javascript. The second simply calling the first and saving the results to a file. There is a "max" parameter in case you include too many items in your feed for a reasonably lengthed html display.

package XML::RSS::JavaScript;

use strict;
use Carp;
use base 'XML::RSS';

sub save_javascript {
   my ( $self, $file, $max ) = @_;
   open( OUT, ">$file" ) || croak "Cannot open file $file for write: $!";
       print OUT $self->as_javascript( $max );
   close OUT;    
}

sub as_javascript {
   my ( $self, $max ) = @_;

   # Update - 2003-06-12
   # Fixed $max incase a max higher than the number of items is used
   my $items = scalar @{ $self->{ items } };

   if ( not $max or $max > $items ) {
       $max = $items;
   }
   ###

   my $left = "document.write('";
   my $right = "');\n";

   my $output;

   $output .= $left . '<p class="feed_title">' . $self->channel( 'title' ) . '</p>' . $right;
   $output .= $left . '<p class="feed_body">' . $right;

   foreach my $item ( ( @{ $self->{ items } } )[ 0..$max - 1 ] ) {
       $output .= $left . '<a href="' . $item->{ link } . '">' . $item->{ title } . '</a><br />' . $right;
   }

   $output .= $left . '</p>' . $right;

   return $output;
}

1;

The output is purely textual, but you could change it to output the feed image instead of the title. Also, rather than having a paragraph tag and break separated links, you might consider an unordered list. You can do some fancy stuff with lists in CSS.

The Fine Print: The following comments are owned by whoever posted them. We are not responsible for them in any way.
 Full
 Abbreviated
 Hidden
More | Login | Reply
Loading... please wait.
  • Not sure if this fits in to your plans, but FYI: xml-rss.js [aaronland.info] The example page [aaronland.net] is busted (why? who knows?) but it gives you an idea of how it's supposed to work.
    • Hi,

      Thanks for the link, but, there doesn't seem to be any major advantage to that method. It still requires javascript, but now it has to parse the feed too. Rather, i process the feed on the server side, so all you have to include one file with a bunch of document.write() statements in it.

      It's certainly advantageous for people who want to customise what is returned from the feed rather than getting what i choose to give them. But for non-techies, I'm not sure that's viable (or AS viable).