NAME
HTML::Make::Calendar - Make an HTML calendar
SYNOPSIS
use HTML::Make::Calendar 'calendar';
my $cal = calendar ();
print $cal->text ();
my $oldcal = calendar (year => 1966, month => 3);
print $oldcal->text ();
The output HTML looks like this:
January 2021 | ||||||
---|---|---|---|---|---|---|
Mo | Tu | We | Th | Fr | Sa | Su |
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
March 1966 | ||||||
---|---|---|---|---|---|---|
Mo | Tu | We | Th | Fr | Sa | Su |
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 | 31 |
(This example is included as synopsis.pl in the distribution.)
VERSION
This documents version 0.00_05 of HTML-Make-Calendar corresponding to git commit 38a93298a88944d84d98da7db38fbb0ab3fd58c6 released on Fri Jan 22 22:49:23 2021 +0900.
DESCRIPTION
This module constructs HTML calendars.
FUNCTIONS
calendar
my $out = calendar (year => 2010, month => 10);
Make the calendar. The return value is an HTML::Make object. To get the actual HTML, call its text
method:
use utf8;
use FindBin '$Bin';
use HTML::Make::Calendar 'calendar';
my $out = calendar (year => 2021, month => 1);
print $out->text ();
The output HTML looks like this:
January 2021 | ||||||
---|---|---|---|---|---|---|
Mo | Tu | We | Th | Fr | Sa | Su |
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
(This example is included as calendar.pl in the distribution.)
The possible arguments are
- cdata
-
Callback data, see "dayc".
- dayc
-
Day callback which fills in the "day" cell of the calendar. If this is omitted, a default element is added. The day callback is called with three arguments, first "cdata", your data, second the date as a hash reference with arguments
year
,month
anddom
(day of month, a number from 1 to 31), and third the HTML element to attach the return value to, representing the cell of the calendar, like this:&{$dayc} ($cdata, {year => 2020, month => 12, dom => 21}, $td);
where
$td
is an HTML::Make object. - daynames
-
Specify the names of the days. See "Japanese calendar" for an example.
- first
-
The first day of the week. The default is 1 for Monday. Specify 7 to start on Sunday:
use HTML::Make::Calendar 'calendar'; my $cal = calendar (first => 7); print $cal->text ();
The output HTML looks like this:
January 2021 Su Mo Tu We Th Fr Sa 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 (This example is included as first.pl in the distribution.)
Any other day of the week may also be used, for example specify 3 to start the weeks on Wednesdays.
- month
-
The month, as a number from 1 to 12. If the month is omitted, the current month is used as given by "Today" in Date::Calc.
- monthc
-
Callback for month and year name. See "Japanese calendar" for an example.
- year
-
The year, as a four-digit number like
2020
. If the year is omitted, the current year is used, as given by "Today" in Date::Calc.
Phases of the moon
This example demonstrates the use of "dayc" and "cdata" by adding the phase of the moon to your calendar. It requires Astro::MoonPhase (not included with this distribution).
use utf8;
use HTML::Make::Calendar 'calendar';
use Astro::MoonPhase;
use Date::Calc 'Date_to_Time';
my @moons = qw!🌑 🌒 🌓 🌔 🌕 🌖 🌗 🌘!;
my $cal = calendar (dayc => \&daymoon, cdata => \@moons);
print $cal->text ();
exit;
sub daymoon
{
my ($moons, $date, $element) = @_;
my $epochtime = Date_to_Time ($date->{year}, $date->{month},
$date->{dom}, 0, 0, 0);
my ($phase) = phase ($epochtime);
my $text = $moons->[int (8*$phase)] . " <b>$date->{dom}</b>";
$element->add_text ($text);
}
The output HTML looks like this:
January 2021 | ||||||
---|---|---|---|---|---|---|
Mo | Tu | We | Th | Fr | Sa | Su |
ð 1 | ð 2 | ð 3 | ||||
ð 4 | ð 5 | ð 6 | ð 7 | ð 8 | ð 9 | ð 10 |
ð 11 | ð 12 | ð 13 | ð 14 | ð 15 | ð 16 | ð 17 |
ð 18 | ð 19 | ð 20 | ð 21 | ð 22 | ð 23 | ð 24 |
ð 25 | ð 26 | ð 27 | ð 28 | ð 29 | ð 30 | ð 31 |
(This example is included as moon.pl in the distribution.)
Daily menu
This example demonstrates the use of "dayc" and "cdata", and how to add your own HTML into the cells of the calendar.
use utf8;
use FindBin '$Bin';
use HTML::Make::Calendar 'calendar';
my @foods = split '', <<EOF;
🍇🍈🍉🍊🍋🍌🍍🥭🍎🍏🍐🍑🍒🍓🥝🍅🥝
🍅🥒🥬🥦🧄🧅🍄🥜🌰🍘🍙🍚🍛🍜🍝🍠🍢
🍣🍤🍥🥮🍡🥟🥠🥡🦪🍦🍧🍨🍩🍪🎂🍰🧁
EOF
@foods = grep {!/\s/} @foods;
my $cal = calendar (cdata => \@foods, dayc => \&add_food);
print $cal->text ();
exit;
sub add_food
{
my ($foods, $date, $element) = @_;
my $today =
$element->push ('span', text => $date->{dom});
my $menu = HTML::Make->new ('ol');
for (1..3) {
my $food = $foods->[int (rand (@$foods))];
$menu->push ('li', text => $food);
}
$element->push ($menu);
}
The output HTML looks like this:
January 2021 | ||||||
---|---|---|---|---|---|---|
Mo | Tu | We | Th | Fr | Sa | Su |
1
|
2
|
3
|
||||
4
|
5
|
6
|
7
|
8
|
9
|
10
|
11
|
12
|
13
|
14
|
15
|
16
|
17
|
18
|
19
|
20
|
21
|
22
|
23
|
24
|
25
|
26
|
27
|
28
|
29
|
30
|
31
|
(This example is included as menu.pl in the distribution.)
Japanese calendar
This example shows making a Japanese calendar using "daynames" as well as "monthc" to put the month name into Japanese. It uses Date::Qreki, Calendar::Japanese::Holiday, Lingua::JA::Numbers, and Lingua::JA::FindDates to make various bits of information typically found on Japanese calendars.
use utf8;
use FindBin '$Bin';
use HTML::Make::Calendar 'calendar';
use Date::Qreki 'rokuyou_unicode';
use Calendar::Japanese::Holiday;
use Lingua::JA::Numbers 'num2ja';
use Lingua::JA::FindDates 'seireki_to_nengo';
my @daynames = (qw!月 火 水 木 金 土 日!);
my $calendar = calendar (daynames => \@daynames,
monthc => \&jmonth,
dayc => \&jday, first => 7);
print $calendar->text ();
exit;
sub jday
{
my (undef, $date, $element) = @_;
my @jdate = ($date->{year}, $date->{month}, $date->{dom});
my $name = isHoliday (@jdate);
my $rokuyou = rokuyou_unicode (@jdate);
$element->push ('span', text => num2ja ($date->{dom}));
$element->push ('br');
$element->push ('span', text => $rokuyou, attr => {class => 'rokuyou'});
if ($name) {
$element->push ('br');
$element->push ('b', text => $name);
$element->add_class ('holiday');
}
}
sub jmonth
{
my (undef, $date, $element) = @_;
my $month = $date->{month} . '月';
my $year = seireki_to_nengo ("$date->{year}年");
my $ym = "$year$month";
$ym =~ s/([0-9]+)/num2ja($1)/ge;
$element->add_text ($ym);
}
The output HTML looks like this:
令åä¸å¹´ä¸æ | ||||||
---|---|---|---|---|---|---|
æ¥ | æ | ç« | æ°´ | æ¨ | é | å |
ä¸
ä»æ» å æ¥ |
äº
å¤§å® |
|||||
ä¸
èµ¤å£ |
å
å å |
äº
åå¼ |
å
å è² |
ä¸
ä»æ» |
å
«
å¤§å® |
ä¹
èµ¤å£ |
å
å å |
åä¸
åå¼ æ人ã®æ¥ |
åäº
å è² |
åä¸
èµ¤å£ |
åå
å å |
åäº
åå¼ |
åå
å è² |
åä¸
ä»æ» |
åå
«
å¤§å® |
åä¹
èµ¤å£ |
äºå
å å |
äºåä¸
åå¼ |
äºåäº
å è² |
äºåä¸
ä»æ» |
äºåå
å¤§å® |
äºåäº
èµ¤å£ |
äºåå
å å |
äºåä¸
åå¼ |
äºåå
«
å è² |
äºåä¹
ä»æ» |
ä¸å
å¤§å® |
ä¸åä¸
èµ¤å£ |
(This example is included as japanese.pl in the distribution.)
DEFAULT HTML ELEMENTS AND CSS CLASSES
The elements of the calendar have the following default HTML elements and CSS default style names:
- calendar
-
The default HTML element for
calendar
(the calendar itself) is<table>
with classcalendar
. - month
-
The default HTML element for
month
(a month) is<table>
with classcal-month
. - week
-
The default HTML element for
week
(a week) is<tr>
with classcal-week
. - day
-
The default HTML element for
day
(a day) is<td>
with classcal-day
as well as classcal-mon
,cal-tue
, etc. - dow
-
The default HTML element for
dow
(the day of the week (Monday, Tuesday, etc.)) is<th>
with classcal-dow
.
TERMINOLOGY
- dow = day of the week (Monday, Tuesday, etc.)
- dom = day of the month (1 to 31)
- wom = week of the month (corresponds to the rows of the calendar)
DEPENDENCIES
- Date::Calc
-
Date::Calc supplies the date information for the calendar.
- HTML::Make
-
HTML::Make is used to generate the HTML for the calendar.
- Table::Readable
-
Table::Readable is used to read a table of HTML element and CSS class defaults.
SCRIPT
See html-cal in the distribution.
SEE ALSO
Other CPAN modules
- Calendar::List
- Calendar::Schedule
- Calendar::Simple
- Date::Calendar
-
Includes a script cal2html for making HTML.
- HTML::Calendar::Monthly
-
Fork of "HTML::Calendar::Simple". The documentation is largely copy-pasted from that with some alterations.
- HTML::Calendar::Simple
- HTML::CalendarMonth
- HTML::CalendarMonthSimple
- SVG::Calendar
Other HTML calendar generators
- Python
-
The defaults of HTML calendar are somewhat based on Python's calendar.HTMLCalendar.
AUTHOR
Ben Bullock, <bkb@cpan.org>
COPYRIGHT & LICENCE
This package and associated files are copyright (C) 2021 Ben Bullock.
You can use, copy, modify and redistribute this package and associated files under the Perl Artistic Licence or the GNU General Public Licence.