DateTime-Format-Mail

 view release on metacpan or  search on metacpan

lib/DateTime/Format/Mail.pm  view on Meta::CPAN

package DateTime::Format::Mail;
# $Id$
$DateTime::Format::Mail::VERSION = '0.403';
use strict;
use 5.005;
use Carp;
use DateTime 1.04;
use Params::Validate qw( validate validate_pos SCALAR );
use vars qw( $VERSION );

my %validations = (
    year_cutoff =>  {
        type => SCALAR,
        callbacks => {
            'greater than or equal to zero, less than 100' => sub {
                defined $_[0]
                    and $_[0] =~ /^ \d+ $/x
                    and $_[0] >= 0
                    and $_[0] < 100
            },
        },
    }
);

# Timezones for strict parser.
my %timezones = qw(
    EDT -0400   EST -0500       CDT -0500       CST -0600
    MDT -0600   MST -0700       PDT -0700       PST -0800
    GMT +0000   UT  +0000
);
my $tz_RE = join( '|', sort keys %timezones );
$tz_RE= qr/(?:$tz_RE)/;
$timezones{UTC} = $timezones{UT};

# Strict parser regex

# Lovely regex. Mostly a translation of the BNF in 2822.
# XXX - need more thorough tests to ensure it's *strict*.

my $strict_RE = qr{
    ^ \s* # optional
    # [day-of-week "," ]
    (?:
      (?:Mon|Tue|Wed|Thu|Fri|Sat|Sun) ,
      \s+
    )?
    # date => day month year
    (\d{1,2})  # day => 1*2DIGIT
    \s+
    (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) # month-name
    \s*
    ((?:\d\d)?\d\d) # year
    # FWS
    \s+
    # time
    (\d\d):(\d\d):(\d\d) # time
    (?:
        \s+ (
            [+-] \d{4}  # standard form
            | $tz_RE    # obsolete form (mostly ignored)
            | [A-IK-Za-ik-z]  # including military (no 'J')
            ) # time zone (optional)
    )?
    \s* $
}ox;

# Loose parser regex
my $loose_RE = qr{
    ^ \s* # optional
    (?i:
        (?:Mon|Tue|Wed|Thu|Fri|Sat|Sun|[A-Z][a-z][a-z]) ,? # Day name + comma
    )?
        # (empirically optional)
    \s*



( run in 0.852 second using v1.01-cache-2.11-cpan-39bf76dae61 )