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 )