File Coverage

blib/lib/HTML/Latemp/News.pm
Criterion Covered Total %
statement 16 29 55.1
branch 0 2 0.0
condition n/a
subroutine 6 8 75.0
pod n/a
total 22 39 56.4


line stmt bran cond sub pod time code
1             package HTML::Latemp::News;
2              
3 1     1   21659 use warnings;
  1         2  
  1         32  
4 1     1   4 use strict;
  1         1  
  1         26  
5              
6 1     1   29 use 5.008;
  1         4  
  1         151  
7              
8              
9             our $VERSION = '0.1.9';
10              
11              
12             package HTML::Latemp::News::Base;
13              
14 1     1   5 use base 'Class::Accessor';
  1         1  
  1         589  
15 1     1   3639 use CGI;
  1         26391  
  1         8  
16              
17             sub new
18             {
19 0     0     my $class = shift;
20 0           my $self = {};
21 0           bless $self, $class;
22 0           $self->initialize(@_);
23 0           return $self;
24             }
25              
26             package HTML::Latemp::News::Item;
27              
28             our @ISA=(qw(HTML::Latemp::News::Base));
29              
30             __PACKAGE__->mk_accessors(qw(index title id description author date
31             category text));
32              
33             sub initialize
34             {
35 0     0     my $self = shift;
36              
37 0           my (%args) = (@_);
38              
39 0           foreach my $k (keys(%args))
40             {
41 0 0         if (! $self->can($k))
42             {
43 0           die "Unknown property for HTML::Latemp::News::Item - \"$k\"!";
44             }
45 0           $self->set($k, $args{$k});
46             }
47             }
48              
49             package HTML::Latemp::News;
50              
51             our @ISA=(qw(HTML::Latemp::News::Base));
52              
53             __PACKAGE__->mk_accessors(qw(copyright description docs generator items
54             language link managing_editor rating title ttl webmaster));
55              
56 1     1   669 use XML::RSS;
  0            
  0            
57              
58             sub input_items
59             {
60             my $self = shift;
61              
62             my $items = shift;
63              
64             return
65             [
66             map
67             { $self->input_single_item($_, $items->[$_]) }
68             (0 .. $#$items)
69             ];
70             }
71              
72             sub input_single_item
73             {
74             my $self = shift;
75             my ($index, $inputted_item) = (@_);
76              
77             return
78             HTML::Latemp::News::Item->new(
79             %$inputted_item,
80             'index' => $index,
81             );
82             }
83              
84             sub initialize
85             {
86             my $self = shift;
87              
88             my %args = (@_);
89              
90             my $items = $args{'news_items'};
91              
92             $self->items(
93             $self->input_items($items)
94             );
95              
96             $self->title($args{'title'});
97             $self->link($args{'link'});
98             $self->language($args{'language'});
99             $self->rating($args{'rating'} || '(PICS-1.1 "http://www.classify.org/safesurf/" 1 r (SS~~000 1))');
100             $self->copyright($args{'copyright'} || "");
101             $self->docs($args{'docs'} || "http://blogs.law.harvard.edu/tech/rss");
102             $self->ttl($args{'ttl'} || "360");
103             $self->generator($args{'generator'} || "Perl and XML::RSS");
104             $self->webmaster($args{'webmaster'});
105             $self->managing_editor($args{'managing_editor'} || $self->webmaster());
106             $self->description($args{'description'});
107              
108             return 0;
109             }
110              
111              
112             sub add_item_to_rss_feed
113             {
114             my $self = shift;
115             my %args = (@_);
116              
117             my $item = $args{'item'};
118             my $rss_feed = $args{'feed'};
119              
120             my $item_url = $self->get_item_url($item);
121              
122             $rss_feed->add_item(
123             'title' => $item->title(),
124             'link' => $item_url,
125             'permaLink' => $item_url,
126             'enclosure' => { 'url' => $item_url, },
127             'description' => $item->description(),
128             'author' => $item->author(),
129             'pubDate' => $item->date(),
130             'category' => $item->category(),
131             );
132             }
133              
134             sub get_item_url
135             {
136             my $self = shift;
137             my $item = shift;
138             return $self->link() . $self->get_item_rel_url($item);
139             }
140              
141             sub get_item_rel_url
142             {
143             my $self = shift;
144             my $item = shift;
145             return "news/" . $item->id() . "/";
146             }
147              
148             sub get_items_to_include
149             {
150             my $self = shift;
151             my $args = shift;
152              
153             my $num_items_to_include = $args->{'num_items'} || 10;
154              
155             my $items = $self->items();
156              
157             if (@$items < $num_items_to_include)
158             {
159             $num_items_to_include = scalar(@$items);
160             }
161              
162             return [ @$items[(-$num_items_to_include) .. (-1)] ];
163             }
164              
165             sub generate_rss_feed
166             {
167             my $self = shift;
168              
169             my %args = (@_);
170              
171             my $rss_feed = XML::RSS->new('version' => "2.0");
172             $rss_feed->channel(
173             'title' => $self->title(),
174             'link' => $self->link(),
175             'language' => $self->language(),
176             'description' => $self->description(),
177             'rating' => $self->rating(),
178             'copyright' => $self->copyright(),
179             'pubDate' => (scalar(localtime())),
180             'lastBuildDate' => (scalar(localtime())),
181             'docs' => $self->docs(),
182             'ttl' => $self->ttl(),
183             'generator' => $self->generator(),
184             'managingEditor' => $self->managing_editor(),
185             'webMaster' => $self->webmaster(),
186             );
187              
188             foreach my $single_item (@{$self->get_items_to_include(\%args)})
189             {
190             $self->add_item_to_rss_feed(
191             'item' => $single_item,
192             'feed' => $rss_feed,
193             );
194             }
195              
196             my $filename = $args{'output_filename'} || "rss.xml";
197              
198             $rss_feed->save($filename);
199             }
200              
201              
202             sub get_navmenu_items
203             {
204             my $self = shift;
205             my %args = (@_);
206              
207             my @ret;
208              
209             foreach my $single_item (reverse(@{$self->get_items_to_include(\%args)}))
210             {
211             push @ret,
212             {
213             'text' => $single_item->title(),
214             'url' => $self->get_item_rel_url($single_item),
215             };
216             }
217             return \@ret;
218             }
219              
220              
221             sub format_news_page_item
222             {
223             my $self = shift;
224             my (%args) = (@_);
225              
226             my $item = $args{'item'};
227             my $base_url = $args{'base_url'};
228              
229             return "

id() . "/\">" .

230             CGI::escapeHTML($item->title()) . "\n" .
231             "

\n" . $item->description() . "\n

\n";
232             }
233              
234             sub get_news_page_entries
235             {
236             my $self = shift;
237             my %args = (@_);
238              
239             my $html = "";
240              
241             my $base_url = exists($args{'base_url'}) ? $args{'base_url'} : "";
242              
243             foreach my $single_item (reverse(@{$self->get_items_to_include(\%args)}))
244             {
245             $html .=
246             $self->format_news_page_item(
247             'item' => $single_item,
248             'base_url' => $base_url,
249             );
250             }
251             return $html;
252             }
253              
254              
255             sub get_news_box_contents
256             {
257             my $self = shift;
258             my (%args) = (@_);
259              
260             my $html = "";
261             foreach my $item (reverse(@{$self->get_items_to_include(\%args)}))
262             {
263             $html .= "
  • 264             $self->get_item_rel_url($item) . "\">" .
    265             CGI::escapeHTML($item->title()) . "\n";
    266             }
    267             return $html;
    268             }
    269              
    270              
    271             sub get_news_box
    272             {
    273             my $self = shift;
    274              
    275             my $html = "";
    276              
    277             $html .= qq{
    \n};
    278             $html .= qq{

    News

    \n};
    279             $html .= qq{
      \n};
    280             $html .=
    281             $self->get_news_box_contents(
    282             @_
    283             );
    284             $html .= qq{
  • More…
  • };
    285             $html .= qq{\n};
    286             $html .= qq{\n};
    287             return $html;
    288             }
    289              
    290              
    291             1;
    292              
    293             __END__