Category: | Miscellaneous |
Author/Contact Info | |
Description: | For a web application that I have been working on, I needed to display a small calendar with each day of the month lined up within day of the week columns. After searching the site, most answers to questions asking for something like this direct people to existing CPAN modules such as HTML::CalendarMonthSimple and PlotCalendar::Month. The problems with these solutions for my project is that I wanted to have more control over the HTML formatting output by the calendar routine.
The result is this snippet of code which returns a data structure which can be passed directly to HTML::Template for display as desired. eg.
|
#!/usr/bin/perl -w use Data::Dumper; use Date::Calc qw/Day_of_Week Days_in_Month/; use strict; print STDOUT Dumper(&calendar_array); exit 0; sub calendar_array (;$$) { my $year = ($_[0] =~ /^\d{4}$/) ? $_[0] : (((localtime)[5]) + 1900 +); my $month = (($_[1] =~ /^\d+$/) && (($_[1] > 0) && ($_[1] < 13))) +? $_[1] : (((localtime)[4]) + 1); my (@calendar, @output); my $day = 1 - Day_of_Week($year, $month, 1); while ($#calendar < 41) { push (@calendar, (($day <= 0) || ($day > Days_in_Month($year, +$month))) ? '' : $day); ++$day; } for (my $row = 0; $row < 6; $row++) { my @columns; for (my $col = 0; $col < 7; $col++) { push (@columns, { 'day' => $calendar[$row * 7 + $col], }); } push (@output, { 'row' => \@columns }); } return \@output; } |
Back to
Code Catacombs