HTML-Microformats
view release on metacpan or search on metacpan
lib/HTML/Microformats/Datatype/DateTime/Parser.pm view on Meta::CPAN
return 1;
}
sub _add_year {
my %p = @_;
no strict 'refs';
$p{ parsed }{ year } = ( $p{ self }{ base_datetime } || DateTime->now )->year;
$p{ self }{ missing_details }{ year } = 1;
use strict qw(subs vars); no warnings;
return 1;
}
sub _fractional_second {
my %p = @_;
$p{ parsed }{ nanosecond } = ".$p{ parsed }{ nanosecond }" * 10**9;
return 1;
}
sub _fractional_minute {
my %p = @_;
$p{ parsed }{ second } = ".$p{ parsed }{ second }" * 60;
return 1;
}
sub _fractional_hour {
my %p = @_;
$p{ parsed }{ minute } = ".$p{ parsed }{ minute }" * 60;
return 1;
}
sub _normalize_offset {
my %p = @_;
return 1 unless (defined $p{ parsed }{ time_zone });
$p{ parsed }{ time_zone } =~ s/://;
if( length $p{ parsed }{ time_zone } == 3 ) {
$p{ parsed }{ time_zone } .= '00';
}
elsif( length $p{ parsed }{ time_zone } == 2 ) {
$p{ parsed }{ time_zone } .= '000';
}
return 1;
}
sub _normalize_week {
my %p = @_;
# from section 4.3.2.2
# "A calendar week is identified within a calendar year by the calendar
# week number. This is its ordinal position within the year, applying the
# rule that the first calendar week of a year is the one that includes the
# first Thursday of that year and that the last calendar week of a
# calendar year is the week immediately preceding the first calendar week
# of the next calendar year."
# this make it oh so fun to covert an ISO week number to a count of days
my $dt = DateTime->new(
year => $p{ parsed }{ year },
);
if ( $dt->week_number == 1 ) {
$p{ parsed }{ week } -= 1;
}
$p{ parsed }{ week } *= 7;
if( defined $p{ parsed }{ day_of_year } ) {
$p{ parsed }{ week } -= $dt->day_of_week -1;
}
$p{ parsed }{ day_of_year } += $p{ parsed }{ week };
delete $p{ parsed }{ week };
return 1;
}
sub _normalize_century {
my %p = @_;
$p{ parsed }{ year } .= '01';
return 1;
}
# TOBY - new preprocessing function, primarily to handle HTML5 date formats.
sub _do_whitespace {
my %args = @_;
my ($date, $p) = @args{qw( input parsed )};
# Normalise white space.
$date =~ s/(^\s+|\s+$)//g;
$date =~ s/\s+/ /g;
# HTML 5 split date with whitespace between Date and Time
$date =~ s/\-(\d\d?)\s(\d\d?)\:/sprintf("\-%02dT%02d\:", $1, $2)/ex;
# Also white space before the timezone
if ($date =~ / ([Z\+\-])([0-9\:]*)$/i)
{
# And the time zone may be weird and need reformatting
my $sign = $1;
my $nums = $2;
my $tz = '';
if (uc($sign) eq 'Z')
{ $tz = 'Z'; }
elsif ($nums =~ /^(\d{0,2})$/)
{ $tz = sprintf('%s%02d00', $sign, $1); }
elsif ($nums =~ /^(\d{1,2})(\d{2})?$/)
{ $tz = sprintf('%s%02d%02d', $sign, $1, $2); }
elsif ($nums =~ /^(\d{0,2})\:(\d{0,2})?$/)
{ $tz = sprintf('%s%02d%02d', $sign, $1, $2); }
( run in 2.420 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )