App-calx
view release on metacpan or search on metacpan
script/calx view on Meta::CPAN
#!perl
use 5.010001;
use strict;
use warnings;
use App::calx;
use DateTime;
use Getopt::Long qw(:config gnu_getopt no_ignore_case);
our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
our $DATE = '2023-06-22'; # DATE
our $DIST = 'App-calx'; # DIST
our $VERSION = '0.009'; # VERSION
my %args = (
months => 1,
caldates_modules => [],
);
my $dates = [];
GetOptions(
'h' => sub { $args{highlight_today} = 0 },
'1' => sub { $args{months} = 1 },
'3' => sub { $args{months} = 3 },
'y' => sub { $args{months} = 12 },
'c=s' => $args{caldates_modules},
'date=s' => $dates,
'a' => sub {
require Module::List::Tiny;
my $mods = Module::List::Tiny::list_modules(
"Calendar::Dates::", {list_modules=>1, recurse=>1});
my @res = sort keys %$mods;
for (@res) { s/\ACalendar::Dates::// }
$args{caldates_modules} = \@res;
},
);
my $dt = DateTime->now;
my $re = qr/\A((\d{4})-(\d{2})-(\d{2}))(?:\t(.+))?\z/;
if (!(-t STDIN)) { ## no critic: InputOutput::ProhibitInteractiveTest
my @dates;
while (my $line = <STDIN>) {
chomp $line;
$line =~ $re or die "Invalid date syntax '$line'\n";
push @dates, {
date => $1,
day => $4,
month => $3,
year => $2,
summary => $5,
};
}
$args{dates} = \@dates;
} elsif (@$dates) {
my @dates;
for my $date (@$dates) {
$date =~ $re or die "Invalid date syntax '$date'\n";
push @dates, {
date => $1,
day => $4,
month => $3,
year => $2,
summary => $5,
};
}
$args{dates} = \@dates;
} elsif (@ARGV == 1) {
$args{year} = $ARGV[0];
$args{months} = 12;
} elsif (@ARGV == 2) {
$args{month} = $ARGV[0];
$args{year} = $ARGV[1];
} else {
$args{month} = $dt->month;
$args{year} = $dt->year;
}
if ($args{months} == 3) {
$dt = DateTime->new(year=>$args{year}, month=>$args{month}//1, day=>1);
$dt->subtract(months=>1);
$args{month} = $dt->month;
$args{year} = $dt->year;
}
my $res = App::calx::gen_calendar(%args);
die $res->[1] unless $res->[0] == 200;
say $res->[2];
1;
# ABSTRACT: Display calendar, with highlighted dates
# PODNAME: calx
__END__
=pod
=encoding UTF-8
=head1 NAME
calx - Display calendar, with highlighted dates
=head1 VERSION
This document describes version 0.009 of calx (from Perl distribution App-calx), released on 2023-06-22.
=head1 SYNOPSIS
# show calendar for the current month, with dates from Calendar::Dates::ID::Holiday
% calx -c ID::Holiday
# show calendar for the current month, with dates from Calendar::Dates::ID::Holiday and Calendar::Dates::SG::Holiday
% calx -c ID::Holiday -c SD::Holiday
# show calendar for the current month, with dates from all installed Calendar::Dates::* modules
% calx -a
# show calendar for the whole year
% calx 2019 -c ID::Holiday
# show calendar for a certain month and year
% calx 2 2019 -c ID::Holiday
# echo -e "2023-05-30\n2023-05-31\n2023-06-01\n" | calx
=head1 DESCRIPTION
This command provides a variant of B<cal> utility for displaying ASCII calendar
on the command-line. It focuses on highlighting certain dates. It currently
always starts the week at Monday and can get the list of dates from command-line
option (`--date`) or stdin or one or more L<Calendar::Dates>::* modules.
=head1 OPTIONS
% calx [opts] [[month] year]
Most options follow B<cal>. Not all options from B<cal> are
supported/recognized. Some options are specific to B<calx>.
( run in 0.617 second using v1.01-cache-2.11-cpan-f56aa216473 )