DateTime-Calendar-FrenchRevolutionary
view release on metacpan or search on metacpan
#!/usr/local/bin/perl -w
#
# Example script for DateTime::Calendar::FrenchRevolutionary:
# print a French Revolutionary calendar
# Copyright (C) 2003, 2004, 2010, 2011, 2014, 2016, 2019, 2021 Jean Forget. All rights reserved.
#
# See the license in the embedded documentation below.
#
use utf8;
use strict;
use DateTime::Calendar::FrenchRevolutionary;
use Getopt::Long;
use Roman;
use FindBin;
my $lang = 'en';
my $pict = undef;
GetOptions('lang=s' => \$lang, 'kitten=s' => \$pict);
#
# I18N
#
my $ref_labels;
if ($lang eq 'fr') {
$ref_labels = do "$FindBin::Bin/labels_fr";
}
else {
$ref_labels = do "$FindBin::Bin/labels_en";
}
my %labels = %$ref_labels;
binmode STDOUT, ':utf8';
my $annee;
foreach $annee (@ARGV) {
warn "Invalid year", next if $annee <= 0;
prt_cal ($annee);
}
sub prt_cal {
my $year = $_[0]; # French revolutionary year
my $year_1 = $year + 1791; # first corresponding Gregorian year
my $year_2 = $year + 1792; # second corresponding Gregorian year
# HTML header
print <<"EOT";
<html>
<head><title>$labels{calendar}</title>
<meta http-equiv='content-type' content='Text/html; charset=utf-8' />
</head>
<body>
EOT
print qq(<p align='center'><img src='$pict'>\n) if $pict;
# Column headers for the first six months
print <<"EOT";
<h2 align='center'>@{[ Roman $year ]}</h2>
<h3 align='center'>$year_1-$year_2</h3>
<table border width='90%'>
<tr align='center'>
<td>Vendémiaire<br>$labels{month3}[8]-$labels{month3}[9]</td>
<td>Brumaire<br>$labels{month3}[9]-$labels{month3}[10]</td>
<td>Frimaire<br>$labels{month3}[10]-$labels{month3}[11]</td>
<td>Nivôse<br>$labels{month3}[11]-$labels{month3}[0]</td>
<td>Pluviôse<br>$labels{month3}[0]-$labels{month3}[1]</td>
<td>Ventôse<br>$labels{month3}[1]-$labels{month3}[2]</td>
</tr>
EOT
# Building the first six months
my $row = '';
foreach my $m (1..6) {
my $cell = join '<br />', map { one_day($year, $m, $_) } (1..30);
$row .= "<td><pre><br>$cell</pre></td>\n";
}
# Printing the first six months and the headers for the last six months
print <<"EOT";
<tr align='center'>$row</tr>
<tr align='center'>
<td>Germinal<br>$labels{month3}[2]-$labels{month3}[3]</td>
<td>Floréal<br>$labels{month3}[3]-$labels{month3}[4]</td>
<td>Prairial<br>$labels{month3}[4]-$labels{month3}[5]</td>
<td>Messidor<br>$labels{month3}[5]-$labels{month3}[6]</td>
<td>Thermidor<br>$labels{month3}[6]-$labels{month3}[7]</td>
<td>Fructidor<br>$labels{month3}[7]-$labels{month3}[8]</td>
</tr>
EOT
# Building the "-al" and "-idor" months
$row = "";
foreach my $m (7..12) {
my $cell = join '<br />', map { one_day($year, $m, $_) } (1..30);
$row .= "<td><pre><br>$cell</pre></td>\n";
}
print "<tr align='center'>$row</tr>\n";
# Additional days.
# By the way, how many additional days? 5 (normal year) or 6 (leap year)?
my $last = 5;
$last = 6 if DateTime::Calendar::FrenchRevolutionary->new(year => $year)->is_leap_year;
# The additional days are printed in an horizontal row, one per cell
$row = "";
foreach my $rd (1 .. $last) {
$row .= "<td><pre><br>" . one_day($year, 13, $rd) . "</pre></td>\n";
}
print <<"EOT";
<tr align='center'><td colspan='6'>$labels{add_days}</td></tr>
<tr align='center'>$row</tr>
</table></body></html>
EOT
}
sub one_day {
my ($ry, $rm, $rd) = @_; # Revolutionary year, month and day
my $date_r = DateTime::Calendar::FrenchRevolutionary->new(year => $ry, month => $rm, day => $rd);
my $date_g = DateTime->from_object(object => $date_r);
sprintf "%2d (%s %2d)", $rd, $labels{week1}[$date_g->day_of_week_0], $date_g->day;
}
__END__
=encoding utf8
=head1 NAME
prt_cal -- print a French Revolutionary calendar
=head1 SYNOPSIS
prt_cal [--lang=I<language>] [--kitten=I<file>] year
=head1 DESCRIPTION
This program prints a calendar, using the French Revolutionary
calendar. It is not limited to the historical period when this
calendar was in use, you can ask for any year after its beginning. For
example, you can print the calendar for the year 211, which
corresponds to 2002-2003 in the Gregorian calendar. The output is in
HTML, and contains brief indications for which Gregorian date
corresponds to each French Revolutionary date.
=head1 OPTIONS
=over 4
=item language
Some values are language dependant: Gregorian weekday initials,
Gregorian month abbreviations and a few titles. You can select which
language you will use. Known languages are:
=over 4
=item en
English (default)
=item fr
French
=back
=item kitten
In France, traditionnally, the postal service sells calendars for the
next year during November / December. These calendars usually have the
picture of one or more kittens in a basket, or a mountainous
landscape. So, you can do the same with this program, by specifying a
JPEG or GIF URL, which contains the photo of kittens or a picture of
mountains. Don't even think of using anything else, especially
pictures involving scantily clad ladies.
You can try
https://images.google.com/images?hl=en&lr=&ie=ISO-8859-1&output=search&q=kitten+basket
https://images.google.com/images?hl=en&lr=&ie=ISO-8859-1&output=search&q=mountains
but do not even think about
https://images.google.com/images?q=Delacroix+libert%C3%A9+guidant+peuple&hl=en&lr=&ie=UTF-8&output=search
=back
=head1 PARAMETERS
There is a single parameter, the year, according to the French
Revolutionary calendar. This parameter is numeric (Roman number not
permitted).
=head1 KNOWN BUGS
If given several years, the program prints all the requested calendars
on standard output as a single stream. There are HTML delimiters for
each, but they are concatenated.
=head1 AUTHOR
Jean Forget <JFORGET@cpan.org>
=head1 LICENSE STUFF
Copyright (c) 2003, 2004, 2010, 2012, 2014, 2016, 2019, 2021 Jean
Forget. All rights reserved. This program is free software. You can
distribute, adapt, modify, and otherwise mangle
DateTime::Calendar::FrenchRevolutionary under the same terms as perl
5.16.3.
This program is distributed under the same terms as Perl 5.16.3: GNU
Public License version 1 or later and Perl Artistic License
You can find the text of the licenses in the F<LICENSE> file or at
L<https://dev.perl.org/licenses/artistic.html>
and L<https://www.gnu.org/licenses/gpl-1.0.html>.
Here is the summary of GPL:
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 1, or (at your option)
any later version.
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, see L<https://www.gnu.org/licenses/>
or contact the Free Software Foundation, Inc., L<https://www.fsf.org>.
=cut
( run in 1.803 second using v1.01-cache-2.11-cpan-302cb4679cc )