[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [syndication] RSS feeds for bookmarks




On Sun, 25 Nov 2001, Mark Nottingham wrote:

> 
> Interesting. I'm using RSS because I wanted to expose "recently added
> bookmarks", so that someone could subscribe and watch for new things
> in my bookmarks.

nice one - I've been thinking about something similar - little perl
script below, which turns bookmarks files into RSS 1.0. It doesn't pull
out the top 10 by date, but could do so easily (my perl's not up to
much).

cheers

libby

#!/usr/bin/perl

use Netscape::Bookmarks;
use Netscape::Bookmarks::Link;
use Netscape::Bookmarks::Category;


my $bookmarks_file= $ARGV[0];
my $nick= $ARGV[1];


my $bookmarks = Netscape::Bookmarks->new( $bookmarks_file );       

print toRSS($bookmarks);


sub toRSS
        {
        my $self = shift;
 
        my $title = $self->title;
 
        my $str = "<?xml version=\"1.0\" encoding=\"iso8859-1\"?>\n";
	$str .="<rdf:RDF xmlns=\"http://purl.org/rss/1.0/\"\n";;
	$str .=" xmlns:foaf=\"http://xmlns.com/foaf/0.1/\"\n";;
	$str .=" xmlns:rdfs=\"http://www.w3.org/2000/01/rdf-schema#\"\n"; ;
	$str .=" xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\"\n";;
	$str .=" xmlns:dc=\"http://purl.org/dc/elements/1.1/\"; >\n";

	$str .="<channel rdf:about=\"http://intranet.ilrt.bris.ac.uk/files/private/temp/bookmarks/thirdstage/$bookmarks_file\";>\n<link>http://intranet.ilrt.bris.ac.uk/files/private/temp/bookmarks/thirdstage/$bookmarks_file</link>\n";
	$str .="<title>$title</title>\n<description>$title</description>\n<items>\n<rdf:Seq>";

 
        foreach my $ref ( @{$self->elements} )
                {
                $str .= as_list($self,\$ref, 1);
                }

	$str .= "</rdf:Seq>\n</items>\n</channel>\n\n";
	
        foreach my $ref ( @{$self->elements} )
                {
                $str .= as_items($self,\$ref, 1);
                }

	$str .= "</rdf:RDF>";

	$str=~ s/&/&amp;/g;
#	$str=~ s/&/%26/g;
        return $str;
        }              



sub as_list
        {
        my $self = shift;
        my $obj = shift;
        my $level = shift;

 
        my $str;

       if( ref $$obj eq 'Netscape::Bookmarks::Category' )
                {
                foreach my $ref ( @{($$obj)->elements} )
	
                        {
                        $str .= as_list($self, \$ref, $level);
                        }
                }                              

        elsif( ref $$obj eq 'Netscape::Bookmarks::Link' )
                {
                my $title = ($$obj)->title;
                my $url = ($$obj)->href;

                $str .= "<rdf:li rdf:resource=\"". $url."\"/>\n";
		}

        return $str;
 
        }        


sub as_items
        {
        my $self = shift;
        my $obj = shift;
        my $level = shift;
        my $cat = shift;

 
        my $str;

       if( ref $$obj eq 'Netscape::Bookmarks::Category' )
                {
                foreach my $ref ( @{($$obj)->elements} )
                        {
	                my $title = ($$obj)->title;
                        $str .= as_items($self, \$ref, $level, $title);
                        }
                }                              

        elsif( ref $$obj eq 'Netscape::Bookmarks::Link' )
                {
                my $title = ($$obj)->title;
                my $url = ($$obj)->href;
                my $desc = ($$obj)->description;
		my $date = ($$obj)->add_date;

		$str .= "<item rdf:about=\"".$url."\">\n<link>$url</link>\n<title>$title</title>\n";
			if($desc ne ""){
			$str .= "<description>$desc</description>";
			}

			if($cat ne ""){
			$str .= "\n<dc:subject>".$cat."</dc:subject>";
			}


			if($date ne ""){
			my @time=gmtime($date); 
			my $mon=@time[4]+1; 
			my $day=@time[3]; 
			my $year=@time[5]+1900;
 
			my $dd= $year."-".$mon."-".$day;   

			$str .= "\n<dc:date>$dd</dc:date>";
			}



		$str .= "\n<dc:creator>\n<foaf:Person>\n<foaf:mbox rdf:resource=\"".$nick."\" />\n</foaf:Person>\n</dc:creator>\n</item>\n\n";
		}

        return $str;
 
        }