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{
|
||||||
280 | $html .= | ||||||
281 | $self->get_news_box_contents( | ||||||
282 | @_ | ||||||
283 | ); | ||||||
284 | $html .= qq{ |
||||||
285 | $html .= qq{\n}; | ||||||
286 | $html .= qq{\n}; | ||||||
287 | return $html; | ||||||
288 | } | ||||||
289 | |||||||
290 | |||||||
291 | 1; | ||||||
292 | |||||||
293 | __END__ |