App-JobLog
view release on metacpan - search on metacpan
view release on metacpan or search on metacpan
lib/App/JobLog/TimeGrammar.pm view on Meta::CPAN
package App::JobLog::TimeGrammar;
$App::JobLog::TimeGrammar::VERSION = '1.042';
# ABSTRACT: parse natural (English) language time expressions
use Exporter 'import';
our @EXPORT = qw(
parse
daytime
);
use Modern::Perl;
use DateTime;
use Class::Autouse qw(
App::JobLog::Log
);
use Carp 'croak';
use autouse 'App::JobLog::Config' => qw(
log
sunday_begins_week
pay_period_length
start_pay_period
DIRECTORY
);
use autouse 'App::JobLog::Time' => qw(
now
today
tz
);
no if $] >= 5.018, warnings => "experimental::smartmatch";
# some variables we need visible inside the date parsing regex
# %matches holds a complete parsing
# %buffer, as its name suggests, is a temporary buffer
# $d1 and $d2 are the starting and ending dates
our ( %matches, %buffer, $d1, $d2 );
# buffers for numeric month, day, or year
our ( $b1, $b2 );
# holds time of day information
our $time_buffer;
# static maps for translating month and day names to numbers
my ( %month_abbr, %day_abbr );
# the master date parsing regex
my $re = qr{
\A \s*+ (?: (?&ever) | (?&span) ) \s*+ \Z
(?(DEFINE)
(?<ever> (?: all | always | ever | (?:(?:the \s++)? (?: entire | whole ) \s++ )? log ) (?{ $matches{ever} = 1 }) )
(?<span>
((?&date)) (?{ $d1 = $^N; stow($d1) })
(?: (?&span_divider) ((?&date)) (?{ $d2 = $^N; stow($d2) }) )?
)
(?<span_divider> \s*+ (?: -++ | \b(?: through | thru | to | till?+ | until )\b ) \s*+)
(?<at> at | @ )
(?<at_time>
(?{ $time_buffer = undef })
(?: (?: \s++ | \s*+ (?&at) \s*+ ) (?&time))?
)
(?<at_time_on> (?:(?&at) \s++)? (?&time) \s++ on \s++ )
(?<date>
(?{ (%buffer, $b1, $b2, $time_buffer) = ()})
view all matches for this distributionview release on metacpan - search on metacpan
( run in 0.590 second using v1.00-cache-2.02-grep-82fe00e-cpan-d29e8ade9f55 )