#!/usr/bin/perl # EasyRSS # Quickie RSS feed from TSV # Stephen Downes - February 17, 2011 # Set Variables to Taste my $TSVfile = "easyrss_file.tsv"; my $feed_title = "Demo Feed"; my $feed_url = "http://www.downes.ca/testfeed.htm"; my $feed_description = "This is a demo feed."; my $language = "en-us"; my $managingEditor = "stephen@downes.ca (Stephen Downes)"; my $webMaster = "stephen@downes.ca (Stephen Downes)"; # Print Header if ($ENV{'user_agent'} =~ /Mozilla/) { print "Content-Type: text/xml\n\n"; } else { print "Content-type: application/rss+xml\n\n"; } # Print Feed Channel Info my $pubdate = &rfc822_date(time); print qq| $feed_title $feed_url $feed_description $pubdate $pubdate $language http://blogs.law.harvard.edu/tech/rss Easy_RSS $managingEditor $webMaster |; # Read and Print TSV File Data # This assumes data stored in the TSV file as follows: open IN,"$TSVfile" or die "Cannot open file."; my $count = 0; my @elements; while () { chomp; my $item; if ($count == 0) { @elements = split "\t",$_; } else { @itemcontents = split "\t",$_; my $itemcount = 0; foreach my $e (@elements) { $itemcontents[$itemcount] = &rssify($itemcontents[$itemcount]); $item->{lc($e)} = $itemcontents[$itemcount]; $itemcount++; } unless ($item->{pubDate}) { $item->{pubDate} = &rfc822_date(time); } unless ($item->{guid}) { $item->{guid} = $item->{link}; } print qq| $item->{title} $item->{link} $item->{pubDate} $item->{guid} {description} ]]> |; } $count++; } print ""; exit; sub rssify { my ($string) = @_; $string =~ s/&(\w+?);/AMPERSAND$1; /g; $string =~ s/&/&/mig; $string =~ s/AMPERSAND(\w+?);/&$1;/g; return $string; } sub rfc822_date { # Get date from input my ($current) = @_; my $date; # Just return it if it's not a date number if (($current+0) == 0) { return $current; } my @days = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat'); my @months = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'); # Extract values for date my ($sec,$min,$hour,$mday,$mon, $year,$wday,$yday,$isdst) = localtime($current); # Y2K $year = $year - 100; if ($year < 0) { $year = 2000+$year; } elsif ($year == 0) { $year = "2000"; } else { $year = 2000+$year; } if ($hour < 10) { $hour = "0" . $hour; } if ($min < 10) { $min = "0" . $min; } if ($sec < 10) { $sec = "0" . $sec; } return "$days[$wday], $mday $months[$mon] $year $hour:$min:$sec -0400"; }