| blib/lib/HTML/Latemp/News.pm | |||
|---|---|---|---|
| Criterion | Covered | Total | % |
| statement | 15 | 28 | 53.5 |
| branch | 0 | 2 | 0.0 |
| condition | n/a | ||
| subroutine | 6 | 8 | 75.0 |
| pod | n/a | ||
| total | 21 | 38 | 55.2 |
| line | stmt | bran | cond | sub | pod | time | code |
|---|---|---|---|---|---|---|---|
| 1 | package HTML::Latemp::News; | ||||||
| 2 | |||||||
| 3 | 1 | 1 | 21636 | use warnings; | |||
| 1 | 3 | ||||||
| 1 | 33 | ||||||
| 4 | 1 | 1 | 5 | use strict; | |||
| 1 | 1 | ||||||
| 1 | 21 | ||||||
| 5 | |||||||
| 6 | 1 | 1 | 19 | use 5.008; | |||
| 1 | 3 | ||||||
| 7 | |||||||
| 8 | |||||||
| 9 | our $VERSION = '0.1.10'; | ||||||
| 10 | |||||||
| 11 | |||||||
| 12 | package HTML::Latemp::News::Base; | ||||||
| 13 | |||||||
| 14 | 1 | 1 | 6 | use base 'Class::Accessor'; | |||
| 1 | 1 | ||||||
| 1 | 898 | ||||||
| 15 | 1 | 1 | 3466 | use CGI; | |||
| 1 | 37040 | ||||||
| 1 | 7 | ||||||
| 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 | 1472 | 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__ |