File Coverage

blib/lib/OurCal/View/ICalendar.pm
Criterion Covered Total %
statement 19 21 90.4
branch n/a
condition n/a
subroutine 7 7 100.0
pod n/a
total 26 28 92.8


line stmt bran cond sub pod time code
1             package OurCal::View::ICalendar;
2              
3 1     1   1412 use strict;
  1         2  
  1         38  
4              
5 1     1   6 use Data::ICal::DateTime;
  1         2  
  1         16  
6 1     1   944 use Data::ICal::Entry::Event;
  1         321  
  1         40  
7 1     1   6 use Digest::MD5 qw(md5_hex);
  1         2  
  1         40  
8 1     1   6 use HTTP::Date;
  1         3  
  1         50  
9 1     1   5 use DateTime;
  1         41  
  1         8  
10 1     1   388 use Text::Chump;
  0            
  0            
11             use CGI qw(:standard);
12             use URI::Find::Simple qw(list_uris);
13              
14              
15             =head1 NAME
16              
17             OurCal::View::ICalendar - an ICalendar view
18              
19             =head1 METHODS
20              
21             =cut
22              
23              
24             =head2 new
25              
26             =cut
27              
28             sub new {
29             my ($class, %what) = @_;
30             return bless \%what, $class;
31             }
32              
33             =head2 mime_type
34              
35             Returns the mime type of this view - 'text/calendar'
36              
37             =cut
38              
39             sub mime_type {
40             return "text/calendar";
41             }
42              
43             =head2 handle
44              
45             Returns a string of ICalendar representing events and todo items.
46              
47             Can optionally take a limit param which describes the number of events
48             to have. Defaults to 50.
49              
50             =cut
51              
52             sub handle {
53             my $self = shift;
54             my %opts = @_;
55             $opts{limit} ||= 50;
56              
57             my $tc = Text::Chump->new;
58             $tc->install('link', sub { return "$_[2] ($_[1])" });
59              
60             my @events = $self->{calendar}->events(%opts);
61             my $cal = Data::ICal->new();
62              
63              
64             foreach my $item (@events) {
65             my $event = Data::ICal::Entry::Event->new;
66             my $date = $self->_make_date($item->date);
67             my $uid = md5_hex($date.$item->description);
68             my $desc = $tc->chump($item->description);
69             my ($url) = list_uris($desc);
70              
71             # uid
72             $event->uid( $uid );
73             # start
74             $event->start($date);
75             # summary
76             $event->summary($desc);
77             # description
78             $event->description($desc);
79             # url
80             $event->add_property( url => $url ) if defined $url;
81              
82             $cal->add_entry($event);
83             }
84             return $cal->as_string;
85              
86             }
87              
88             sub _make_date {
89             my $self = shift;
90             my $date = shift;
91             my ($y, $m, $d) = split /-/, $date;
92             return DateTime->new( year => $y, month => $m, day => $d);
93             }
94              
95             1;