package HTML::Latemp::News; $HTML::Latemp::News::VERSION = '0.2.2'; use warnings; use strict; use autodie; use 5.014; package HTML::Latemp::News::Base; $HTML::Latemp::News::Base::VERSION = '0.2.2'; use CGI (); sub new { my $class = shift; my $self = {}; bless $self, $class; $self->initialize(@_); return $self; } package HTML::Latemp::News::Item; $HTML::Latemp::News::Item::VERSION = '0.2.2'; our @ISA = (qw(HTML::Latemp::News::Base)); sub author { my $self = shift; if (@_) { $self->{author} = shift; } return $self->{author}; } sub category { my $self = shift; if (@_) { $self->{category} = shift; } return $self->{category}; } sub date { my $self = shift; if (@_) { $self->{date} = shift; } return $self->{date}; } sub description { my $self = shift; if (@_) { $self->{description} = shift; } return $self->{description}; } sub id { my $self = shift; if (@_) { $self->{id} = shift; } return $self->{id}; } sub index { my $self = shift; if (@_) { $self->{index} = shift; } return $self->{index}; } sub text { my $self = shift; if (@_) { $self->{text} = shift; } return $self->{text}; } sub title { my $self = shift; if (@_) { $self->{title} = shift; } return $self->{title}; } sub initialize { my $self = shift; my (%args) = (@_); foreach my $k ( keys(%args) ) { if ( !$self->can($k) ) { die "Unknown property for HTML::Latemp::News::Item - \"$k\"!"; } $self->can($k)->( $self, $args{$k} ); } } package HTML::Latemp::News; our @ISA = (qw(HTML::Latemp::News::Base)); sub copyright { my $self = shift; if (@_) { $self->{copyright} = shift; } return $self->{copyright}; } sub description { my $self = shift; if (@_) { $self->{description} = shift; } return $self->{description}; } sub docs { my $self = shift; if (@_) { $self->{docs} = shift; } return $self->{docs}; } sub generator { my $self = shift; if (@_) { $self->{generator} = shift; } return $self->{generator}; } sub items { my $self = shift; if (@_) { $self->{items} = shift; } return $self->{items}; } sub language { my $self = shift; if (@_) { $self->{language} = shift; } return $self->{language}; } sub link_ { my $self = shift; if (@_) { $self->{link} = shift; } return $self->{link}; } sub managing_editor { my $self = shift; if (@_) { $self->{managing_editor} = shift; } return $self->{managing_editor}; } sub lastBuildDate { my $self = shift; if (@_) { $self->{lastBuildDate} = shift; } return $self->{lastBuildDate}; } sub pubDate { my $self = shift; if (@_) { $self->{pubDate} = shift; } return $self->{pubDate}; } sub rating { my $self = shift; if (@_) { $self->{rating} = shift; } return $self->{rating}; } sub title { my $self = shift; if (@_) { $self->{title} = shift; } return $self->{title}; } sub ttl { my $self = shift; if (@_) { $self->{ttl} = shift; } return $self->{ttl}; } sub webmaster { my $self = shift; if (@_) { $self->{webmaster} = shift; } return $self->{webmaster}; } use XML::RSS; sub input_items { my $self = shift; my $items = shift; return [ map { $self->input_single_item( $_, $items->[$_] ) } ( 0 .. $#$items ) ]; } sub input_single_item { my $self = shift; my ( $index, $inputted_item ) = (@_); return HTML::Latemp::News::Item->new( %$inputted_item, 'index' => $index, ); } sub initialize { my $self = shift; my %args = (@_); my $items = $args{'news_items'}; $self->items( $self->input_items($items) ); $self->title( $args{'title'} ); $self->link_( $args{'link'} ); $self->language( $args{'language'} ); $self->rating( $args{'rating'} || '(PICS-1.1 "http://www.classify.org/safesurf/" 1 r (SS~~000 1))' ); $self->copyright( $args{'copyright'} || "" ); $self->docs( $args{'docs'} || "http://blogs.law.harvard.edu/tech/rss" ); $self->ttl( $args{'ttl'} || "360" ); $self->generator( $args{'generator'} || "Perl and XML::RSS" ); $self->webmaster( $args{'webmaster'} ); $self->managing_editor( $args{'managing_editor'} || $self->webmaster() ); $self->description( $args{'description'} ); if ( defined( my $date = delete $args{lastBuildDate} ) ) { $self->lastBuildDate($date); } if ( defined( my $date = delete $args{pubDate} ) ) { $self->pubDate($date); } return 0; } sub add_item_to_rss_feed { my $self = shift; my %args = (@_); my $item = $args{'item'}; my $rss_feed = $args{'feed'}; my $item_url = $self->get_item_url($item); $rss_feed->add_item( 'title' => $item->title(), 'link' => $item_url, 'permaLink' => $item_url, 'enclosure' => { 'url' => $item_url, }, 'description' => $item->description(), 'author' => $item->author(), 'pubDate' => $item->date(), 'category' => $item->category(), ); } sub get_item_url { my $self = shift; my $item = shift; return $self->link_() . $self->get_item_rel_url($item); } sub get_item_rel_url { my $self = shift; my $item = shift; return "news/" . $item->id() . "/"; } sub get_items_to_include { my $self = shift; my $args = shift; my $num_items_to_include = $args->{'num_items'} || 10; my $items = $self->items(); if ( @$items < $num_items_to_include ) { $num_items_to_include = scalar(@$items); } return [ @$items[ ( -$num_items_to_include ) .. (-1) ] ]; } sub generate_rss_feed { my $self = shift; my %args = (@_); my $rss_feed = XML::RSS->new( 'version' => "2.0" ); $rss_feed->channel( 'title' => $self->title(), 'link' => $self->link_(), 'language' => $self->language(), 'description' => $self->description(), 'rating' => $self->rating(), 'copyright' => $self->copyright(), 'pubDate' => ( $self->pubDate // ( scalar( localtime() ) ) ), 'lastBuildDate' => ( $self->lastBuildDate // ( scalar( localtime() ) ) ), 'docs' => $self->docs(), 'ttl' => $self->ttl(), 'generator' => $self->generator(), 'managingEditor' => $self->managing_editor(), 'webMaster' => $self->webmaster(), ); foreach my $single_item ( @{ $self->get_items_to_include( \%args ) } ) { $self->add_item_to_rss_feed( 'item' => $single_item, 'feed' => $rss_feed, ); } my $filename = $args{'output_filename'} || "rss.xml"; $rss_feed->save($filename); } sub get_navmenu_items { my $self = shift; my %args = (@_); my @ret; foreach my $single_item ( reverse( @{ $self->get_items_to_include( \%args ) } ) ) { push @ret, { 'text' => $single_item->title(), 'url' => $self->get_item_rel_url($single_item), }; } return \@ret; } sub format_news_page_item { my $self = shift; my (%args) = (@_); my $item = $args{'item'}; my $base_url = $args{'base_url'}; return "
\n" . $item->description() . "\n
\n"; } sub get_news_page_entries { my $self = shift; my %args = (@_); my $html = ""; my $base_url = exists( $args{'base_url'} ) ? $args{'base_url'} : ""; foreach my $single_item ( reverse( @{ $self->get_items_to_include( \%args ) } ) ) { $html .= $self->format_news_page_item( 'item' => $single_item, 'base_url' => $base_url, ); } return $html; } sub get_news_box_contents { my $self = shift; my (%args) = (@_); my $html = ""; foreach my $item ( reverse( @{ $self->get_items_to_include( \%args ) } ) ) { $html .= "