Date-HolidayParser
view release on metacpan or search on metacpan
lib/Date/HolidayParser/iCalendar.pm view on Meta::CPAN
# Used by DP::iCalendar::Manager to set the prodid in output iCalendar files.
# We can't output iCalendar files, so we just ignore calls to it.
sub set_prodid { }
# Purpose: Return manager information
# Usage: get_manager_version();
sub get_manager_version
{
my $self = shift;
return('01_capable');
}
# Purpose: Return manager capability information
# Usage: get_manager_capabilities
sub get_manager_capabilities
{
# All capabilites as of 01_capable
return(['LIST_DPI',])
}
# -- Private methods --
# Purpose: Wraps _addParsedEvent in Date::HolidayParser so that an iCalendar version
# is also created at the same time.
around '_addParsedEvent' => sub
{
my $orig = shift;
my $self = shift;
my($FinalParsing,$final_mon,$final_mday,$HolidayName,$holidayType,$FinalYDay,$PosixYear) = @_;
my $UID = $self->_event_to_iCalendar($FinalYDay,$PosixYear,$HolidayName);
my $Year = $PosixYear+1900;
if(not $self->_iCal_cache->{$Year}->{$final_mon}{$final_mday}{'DAY'})
{
$self->_iCal_cache->{$Year}->{$final_mon}{$final_mday}{'DAY'} = [];
}
push(@{$self->_iCal_cache->{$Year}->{$final_mon}{$final_mday}{'DAY'}}, $UID);
return $self->$orig(@_);
};
# Purpose: Generate an iCalendar entry
# Usage: this->_event_to_iCalendar(UNIXTIME, NAME);
sub _event_to_iCalendar
{
my $self = shift;
my $FinalYDay = shift;
my $PosixYear = shift;
my $name = shift;
$name =~ s/\s/-/g;
my $unixtime = POSIX::mktime(0, 0, 0, $FinalYDay, 0, $PosixYear);
# Generate the UID of the event, this is simply a
my $sum = unpack('%32C*', $name);
# This should be unique enough for our needs.
# We don't want it to be random, because if someone copies the events to their
# own calendar, we want DP::iCalendar::Manager to fetch the information from
# the changed calendar, instead of from the HolidayParser object.
my $UID = 'D-HP-ICS-'.$FinalYDay.'-'.$PosixYear.'-'.$sum;
$self->_UID_List->{$UID} = {
UID => $UID,
DTSTART => iCal_ConvertFromUnixTime($unixtime),
DTEND => iCal_ConvertFromUnixTime($unixtime+86390), # Yes, this is purposefully not 86400
SUMMARY => $name,
};
return($UID);
}
# The following three functions are originally from DP::iCalendar
# Purpose: Generate an iCalendar date-time from multiple values
# Usage: my $iCalDateTime = iCal_GenDateTime(YEAR, MONTH, DAY, TIME);
sub iCal_GenDateTime {
# NOTE: This version ignores $Time because it isn't used in HolidayParser
my ($Year, $Month, $Day, $Time) = @_;
# Fix the month and day
my $iCalMonth = _PrefixZero($Month);
my $iCalDay = _PrefixZero($Day);
return("$Year$iCalMonth$iCalDay");
}
# Purpose: Generate an iCalendar date-time string from a UNIX time string
# Usage: my $iCalDateTime = iCal_ConvertFromUnixTime(UNIX TIME);
sub iCal_ConvertFromUnixTime {
my $UnixTime = shift;
my ($realsec,$realmin,$realhour,$realmday,$realmonth,$realyear,$realwday,$realyday,$realisdst) = localtime($UnixTime);
$realyear += 1900; # Fix the year
$realmonth++; # Fix the month
# Return data from iCal_GenDateTime
return(iCal_GenDateTime($realyear,$realmonth,$realmday,"$realhour:$realmin"));
}
# Purpose: Prefix a "0" to a number if it is only one digit.
# Usage: my $NewNumber = PrefixZero(NUMBER);
sub _PrefixZero {
if ($_[0] =~ /^\d$/) {
return("0$_[0]");
}
return($_[0]);
}
# End of Date::HolidayParser::iCalendar
1;
__END__
=head1 NAME
Date::HolidayParser::iCalendar - iCalendar-like interface extension to Date::HolidayParser
=head1 VERSION
0.4
=head1 SYNOPSIS
This is an extension to Date::HolidayParser that adds an iCalendar-like interface
to the holiday data.
( run in 1.176 second using v1.01-cache-2.11-cpan-75ffa21a3d4 )