File Coverage

blib/lib/iCal/Parser/HTML.pm
Criterion Covered Total %
statement 7 9 77.7
branch n/a
condition n/a
subroutine 3 3 100.0
pod n/a
total 10 12 83.3


line stmt bran cond sub pod time code
1             # $Id: HTML.pm 517 2008-06-30 23:48:04Z rick $
2             package iCal::Parser::HTML;
3              
4 2     2   56751 use strict;
  2         4  
  2         70  
5 2     2   8 use warnings;
  2         4  
  2         198  
6              
7             # Get version from subversion url of tag or branch.
8             our $VERSION= do {(q$URL: svn+ssh://xpc/var/lib/svn/rick/perl/ical/iCal-Parser-HTML/tags/1.07/lib/iCal/Parser/HTML.pm $=~ m$.*/(?:tags|branches)/([^/ \t]+)$)[0]||'0.1'};
9              
10             our @ISA = qw(Exporter);
11             our @EXPORT_OK=qw($xml $xsl);
12              
13 2     2   1819 use iCal::Parser::SAX;
  0            
  0            
14             use XML::LibXML;
15             use XML::LibXML::SAX::Builder;
16             use XML::LibXSLT;
17              
18             our $xsl=XML::LibXSLT->new;
19             our $xml=XML::LibXML->new;
20              
21             our %sheet_cache=();
22              
23             sub new {
24             my $class=shift;
25             return bless {@_},$class;
26             }
27             sub parse {
28             my($self,%args)=@_;
29             my $type=delete $args{type};
30             my $files=delete $args{files};
31             my $url=delete $args{url}||'';
32             #adjust dates to appropriate period
33             my $start=$args{start};
34             unless(ref $start) {
35             $start=$args{start}=$self->parse_partial_datetime($start);
36             }
37             $start->subtract(days=>$start->dow-1) if $type eq 'week';
38             $start->set(day=>1) if $type eq 'month';
39             $start->set(day=>1,month=>1) if $type eq 'year';
40             $args{end}=$start->clone->add("${type}s"=>1);
41              
42             my $sink=XML::LibXML::SAX::Builder->new;
43             my $parser=iCal::Parser::SAX->new(Handler=>$sink,%args);
44             my $result=$parser->parse_uris(@$files);
45              
46             my $sheet=$sheet_cache{$type}||=$xsl
47             ->parse_stylesheet($xml->parse_file(get_sheet_dir() . $type . '.xsl'));
48              
49             return $sheet->output_string
50             ($sheet->transform($result,$self->sheet_args($args{start},$url)));
51             }
52             sub parse_partial_datetime {
53             my($self,$string)=@_;
54             my($y,$m,$d)=($string=~ m/(\d{4})-?(\d{2})?-?(\d{2})?/);
55              
56             my $date=$y ? DateTime->new(year=>$y,
57             ($m ? (month=>$m) :()),
58             ($d ? (day=>$d):())
59             ) : DateTime->now;
60             }
61             sub sheet_args {
62             my($self,$date,$url)=@_;
63             my %args;
64             foreach my $t qw(week month year) {
65             $args{$t}=$date->$t();
66             }
67             $args{date}='"'.$date->ymd .'"';
68             $args{'base-url'}='"'.$url.'"';
69             return %args;
70             }
71             sub get_sheet_dir {
72             my $key=__PACKAGE__ . '.pm';
73             $key=~s|::|/|go;
74             my $path=$INC{$key};
75             $path=~s|\.pm$|/stylesheet/|go;
76             return $path;
77             }
78             1;
79             __END__