1 package HTML::CalendarMonth;
3 $HTML::CalendarMonth::VERSION = '1.26';
10 use HTML::ElementTable 1.18;
11 use HTML::CalendarMonth::Locale;
12 use HTML::CalendarMonth::DateTool;
14 use base qw( Class::Accessor HTML::ElementTable );
18 # default complex attributes
19 my %Calmonth_Attrs = (
20 head_m => 1, # month heading mode
21 head_y => 1, # year heading mode
22 head_dow => 1, # DOW heading mode
23 head_week => 0, # weak of year
24 year_span => 2, # default col span of year
26 today => undef, # DOM, if not now
27 week_begin => 1, # what DOW (1-7) is the 1st DOW?
29 historic => 1, # if able to choose, use ncal/cal
30 # rather than Date::Calc, which
31 # blindly extrapolates Gregorian
33 alias => {}, # what gets displayed if not
36 month => undef, # these will get initialized
48 # internal muckety muck
65 __PACKAGE__->mk_accessors(keys %Calmonth_Attrs);
67 # Class::Accessor overrides
70 my($self, $key) = splice(@_, 0, 2);
72 $Objects{$self}{$key} = $_[0];
75 $Objects{$self}{$key} = [@_];
78 Carp::confess("wrong number of arguments received");
85 return $Objects{$self}{$_[0]};
88 return @{$Objects{$self}{@_}};
91 Carp::confess("wrong number of arguments received.");
95 sub _is_calmonth_attr { shift; exists $Calmonth_Attrs{shift()} }
99 foreach (keys %Calmonth_Attrs) {
100 $self->$_($Calmonth_Attrs{$_});
105 sub DESTROY { delete $Objects{shift()} }
107 # last dow col, first week row
109 use constant LDC => 6;
110 use constant FWR => 2;
115 my($self, $item) = splice(@_, 0, 2);
116 defined $item or croak "item name required";
117 $self->alias->{$item} = shift if @_;
118 $self->alias->{$item} || $item;
122 my($self, $item) = splice(@_, 0, 2);
123 defined $item or croak "item name required.\n";
124 defined $self->alias->{$item};
130 # Set/test entire heading (month,year,and dow headers) (does not
131 # affect week number column). Return true if either heading active.
133 $self->head_m(@_) && $self->head_dow(@_) if @_;
134 $self->_head_my || $self->head_dow;
138 # Set/test month and year header mode
139 my($self, $mode) = splice(@_, 0, 2);
140 $self->head_m($mode) && $self->head_y($mode) if defined $mode;
141 $self->head_m || $self->head_y;
146 @_ ? $self->{_initialized} = shift : $self->{_initialized};
152 # set target month, year
155 my ($month, $year) = @_;
156 $month && defined $year || croak "date method requires month and year";
157 croak "Date already set" if $self->_initialized();
159 # get rid of possible leading 0's
163 $month <= 12 && $month >= 1 or croak "Month $month out of range (1-12)\n";
164 $year > 0 or croak "Negative years are unacceptable\n";
166 $self->month($self->monthname($month));
168 $month = $self->monthnum($month);
170 # trigger _gencal...this should be the only place where this occurs
173 return($self->month, $self->year);
176 # class factory access
178 use constant CLASS_HET => 'HTML::ElementTable';
179 use constant CLASS_DATETOOL => 'HTML::CalendarMonth::DateTool';
180 use constant CLASS_LOCALE => 'HTML::CalendarMonth::Locale';
183 # generate internal calendar representation
186 # new calendar...clobber day-specific settings
187 my $itoc = $self->_itoch({});
188 my $ctoi = $self->_ctoih({});
190 # figure out dow of 1st day of the month as well as last day of the
191 # month (uses date calculator backends)
192 $self->_anchor_month();
194 # row count for weeks in grid
197 my ($dowc) = $self->dow1st;
198 my $skips = $self->_caltool->_skips;
201 foreach (1 .. $self->lastday) {
202 next if $skips->{$_};
205 # this is a bootstrap until we know the number of rows in the month.
206 $itoc->{$_} = [$r, $c];
208 ++$wcnt unless $dowc || $_ == $self->lastday;
211 $self->{_week_rows} = $wcnt;
213 my $row_extent = $wcnt + FWR;
214 my $col_extent = LDC;
215 $col_extent += 1 if $self->head_week;
217 $self->SUPER::extent($row_extent, $col_extent);
219 # table can contain the days now, so replace our bootstrap coordinates
220 # with references to the actual elements.
221 foreach (keys %$itoc) {
222 my $cellref = $self->cell(@{$itoc->{$_}});
223 $self->_itoc($_, $cellref);
224 $self->_ctoi($cellref, $_);
227 # week num affects month/year spans
228 my $width = $self->head_week ? 8 : 7;
231 my $cellref = $self->cell(0, 0);
232 $self->_itoc($self->month, $cellref);
233 $self->_ctoi($cellref, $self->month);
234 $cellref = $self->cell(0, $width - $self->year_span);
235 $self->_itoc($self->year, $cellref);
236 $self->_ctoi($cellref, $self->year);
238 $self->item($self->month)->replace_content($self->item_alias($self->month));
239 $self->item($self->year)->replace_content($self->item_alias($self->year));
241 if ($self->_head_my) {
242 if ($self->head_m && $self->head_y) {
243 $self->item($self->year) ->attr('colspan', $self->year_span);
244 $self->item($self->month)->attr('colspan', $width - $self->year_span);
246 elsif ($self->head_y) {
247 $self->item($self->month)->mask(1);
248 $self->item($self->year)->attr('colspan', $width);
250 elsif ($self->head_m) {
251 $self->item($self->year)->mask(1);
252 $self->item($self->month)->attr('colspan', $width);
256 $self->row(0)->mask(1);
261 my $days = $self->loc->days;
262 foreach (0..$#$days) {
263 # Transform for week_begin 1..7
264 $trans = ($_ + $self->week_begin - 1) % 7;
265 my $cellref = $self->cell(1, $_);
266 $self->_itoc($days->[$trans], $cellref);
267 $self->_ctoi($cellref, $days->[$trans]);
269 if ($self->head_dow) {
270 grep($self->item($_)->replace_content($self->item_alias($_)), @$days);
273 $self->row(1)->mask(1);
277 if ($self->head_week) {
278 # week nums can collide with days. Use "w" in front of the number
279 # for uniqueness, and automatically alias to just the number (unless
280 # already aliased, of course).
281 $self->_gen_week_nums();
284 foreach ($self->_numeric_week_nums) {
286 $self->item_alias($ws, $_) unless $self->item_aliased($ws);
287 my $cellref = $self->cell($row_count, $self->last_col);
288 $self->_itoc($ws, $cellref);
289 $self->_ctoi($cellref, $ws);
290 $self->item($ws)->replace_content($self->item_alias($ws));
295 # fill in days of the month
297 foreach my $r (FWR .. $self->last_row) {
298 foreach my $c (0 .. LDC) {
299 $self->cell($r,$c)->replace_content($self->item_alias($i))
300 if ($i = $self->item_at($r,$c));
305 if ($self->enable_css) {
306 $self->push_attr(class => 'hcm-table');
307 $self->item_row($self->dayheaders)->push_attr(class => 'hcm-day-head')
309 $self->item($self->year)->push_attr(class => 'hcm-year-head')
311 $self->item($self->month)->push_attr(class => 'hcm-month-head')
313 $self->item($self->week_nums) ->push_attr(class => 'hcm-week-head')
317 if ($self->semantic_css) {
318 my $today = $self->today;
320 $self->item($self->days)->push_attr(class => 'hcm-past');
322 elsif ($today == 0) {
323 $self->item($self->days)->push_attr(class => 'hcm-future');
326 for my $d ($self->days) {
328 $self->item($d)->push_attr(class => 'hcm-past');
330 elsif ($d > $today) {
331 $self->item($d)->push_attr(class => 'hcm-future');
334 $self->item($d)->push_attr(class => 'hcm-today');
344 my $hbgc = '#DDDDDD';
348 <style type="text/css">
352 border: thin solid $bc;
353 border-collapse: collapse;
364 background-color: $hbgc;
369 background-color: $hbgc;
374 background-color: $hbgc;
375 border-bottom: thin solid $bc;
380 background-color: $hbgc;
381 border-left: thin solid $bc;
393 if (! ($ct = $self->_caltool)) {
394 $ct = $self->_caltool(CLASS_DATETOOL->new(
396 month => $self->month,
397 weeknum => $self->head_week,
398 historic => $self->historic,
399 datetool => $self->datetool,
406 # Figure out what our month grid looks like.
407 # Let HTML::CalendarMonth::DateTool determine which method is
411 my $month = $self->monthnum($self->month);
412 my $year = $self->year;
414 my $tool = $self->_datetool;
416 my $dow1st = $tool->dow1st; # 0..6, starting with Sun
417 my $lastday = $tool->lastday;
419 # week_begin given as 1..7 starting with Sun
420 $dow1st = ($dow1st - ($self->week_begin - 1)) % 7;
422 $self->dow1st($dow1st);
423 $self->lastday($lastday);
429 # Generate week-of-the-year numbers. The first week is generally
430 # agreed upon to be the week that contains the 4th of January.
432 # For purposes of shenanigans with 'week_begin', we anchor the week
433 # number off of Thursday in each row.
437 my($year, $month, $lastday) = ($self->year, $self->monthnum, $self->lastday);
439 my $tool = $self->_caltool;
440 croak "Oops. " . ref $tool . " not set up for week of year calculations.\n"
441 unless $tool->can('week_of_year');
443 my $fdow = $self->dow1st;
444 my $delta = 4 - $fdow;
448 my @ft = $tool->add_days($delta, 1);
450 my $ldow = $tool->dow($lastday);
455 my @lt = $tool->add_days($delta, $lastday);
457 my $fweek = $tool->week_of_year(@ft);
458 my $lweek = $tool->week_of_year(@lt);
459 my @wnums = $fweek > $lweek ? ($fweek, 1 .. $lweek) : ($fweek .. $lweek);
461 # do we have days above our first Thursday?
462 if ($self->row_of($ft[0]) != FWR) {
463 unshift(@wnums, $wnums[0] -1);
466 # do we have days below our last Thursday?
467 if ($self->row_of($lt[0]) != $self->last_row) {
468 push(@wnums, $wnums[-1] + 1);
471 # first visible week is from last year
472 if ($wnums[0] == 0) {
473 $wnums[0] = $tool->week_of_year($tool->add_days(-7, $ft[0]));
476 # last visible week is from subsequent year
477 if ($wnums[-1] > $lweek) {
478 $wnums[-1] = $tool->week_of_year($tool->add_days(7, $lt[0]));
481 $self->_weeknums(\@wnums);
487 # given a list of items, return all items in rows shared by the
491 foreach my $item (@_) {
492 my $row = ($self->coords_of($item))[0];
493 foreach my $col (0 .. $self->last_col) {
494 my $i = $self->item_at($row, $col) || next;
498 keys %items > 1 ? keys %items : (keys %items)[0];
502 # return all item cells in the columns occupied by the provided list
505 $self->_col_items(0, $self->last_row, @_);
509 # same as col_items(), but excludes header cells.
511 $self->_col_items(FWR, $self->last_row, @_);
515 # given row bounds and a list of items, return all item elements
516 # in the columns occupied by the provided items. Does not return
518 my($self, $rfirst, $rlast) = splice(@_, 0, 3);
520 my($item, $row, $col, %i);
521 foreach my $item (@_) {
522 my $col = ($self->coords_of($item))[1];
523 foreach my $row ($rfirst .. $rlast) {
524 my $i = $self->item_at($row,$col) || next;
528 keys %items > 1 ? keys %items : (keys %items)[0];
532 # return seconds since epoch for a given day
533 my($self, $day) = splice(@_, 0, 2);
534 $day or croak "must specify day of month";
535 croak "day does not exist" unless $self->_daycheck($day);
536 $self->_caltool->day_epoch($day);
540 # return list of all week number labels
541 my @wnums = map("w$_", shift->_numeric_week_nums);
542 wantarray ? @wnums : \@wnums;
545 sub _numeric_week_nums {
546 # return list of all week numbers as numbers
548 return unless $self->head_week;
549 wantarray ? @{$self->_weeknums} : $self->_weeknums;
553 # return list of all days of the month (1..$c->lastday).
555 my $skips = $self->_caltool->_skips;
556 my @days = grep { !$skips->{$_} } (1 .. $self->lastday);
557 wantarray ? @days : \@days;
561 # return list of all day headers (Su..Sa).
566 # return list of all headers (month,year,dayheaders)
568 wantarray ? ($self->year, $self->month, $self->dayheaders)
569 : [$self->year, $self->month, $self->dayheaders];
573 # return list of all items (days, headers)
575 wantarray ? ($self->headers, $self->days)
576 : [$self->headers, $self->days];
580 # what's the max col of the calendar?
582 $self->head_week ? LDC + 1 : LDC;
585 sub last_day_col { LDC }
588 # last row of the calendar
590 return ($self->coords_of($self->lastday))[0];
593 *last_week_row = \&last_row;
595 sub first_week_row { FWR };
599 my $today = $self->_today;
603 elsif ($today == 0) {
611 my $today = $self->_today;
615 elsif ($today == 0) {
618 return($today .. $self->last_day);
621 # custom glob interfaces
624 # return TD elements containing items
626 @_ || croak "item(s) must be provided";
627 $self->cell(grep(defined $_, map($self->coords_of($_), @_)));
631 # return a glob of the rows of a list of items, including empty cells.
633 $self->row(map { $self->row_of($_) } @_);
637 # same as item_row, but excludes possible week number cells
639 return $self->item_row(@_) unless $self->head_week;
641 for my $r (map { $self->row_of($_) } @_) {
642 next if ++$rows{$r} > 1;
644 push(@coords, ($r, $c));
647 $self->cell(@coords);
651 # glob of all week numbers
653 $self->item($self->week_nums);
657 # return a glob of the cols of a list of items, including empty cells.
659 $self->_item_col(0, $self->last_row, @_);
663 # same as item_col(), but excludes header cells.
665 $self->_item_col(2, $self->last_row, @_);
669 # given row bounds and a list of items, return a glob representing
670 # the cells in the columns occupied by the provided items, including
672 my($self, $rfirst, $rlast) = splice(@_, 0, 3);
673 defined $rfirst && defined $rlast or Carp::confess "No items provided";
675 foreach my $col (map { $self->col_of($_) } @_) {
676 next if ++$seen{$col} > 1;
677 foreach my $row ($rfirst .. $rlast) {
678 push(@coords, $row, $col);
681 $self->cell(@coords);
685 # return a glob of the box defined by two items
686 my($self, $item1, $item2) = splice(@_, 0, 3);
687 defined $item1 && defined $item2 or croak "Two items required";
688 $self->box($self->coords_of($item1), $self->coords_of($item2));
692 # return a glob of all calendar cells, including empty cells.
694 $self->box( 0,0 => $self->last_row, $self->last_col );
698 # return a glob of all cells other than header cells
700 $self->box( 2, 0 => $self->last_row, 6 );
704 # return a glob of all header cells
706 $self->item($self->headers);
709 # transformation Methods
712 # convert an item into grid coordinates
714 croak "undefined value passed to coords_of()" if @_ && ! defined $_[0];
715 my $ref = $self->_itoc(@_);
716 my @pos = ref $ref ? $ref->position : ();
717 @pos ? (@pos[$#pos - 1, $#pos]) : ();
721 # convert grid coords into item
723 $self->_ctoi($self->cell(@_));
728 my($self, $item, $ref) = splice(@_, 0, 3);
729 defined $item or croak "item required";
730 my $itoc = $self->_itoch;
732 croak "Reference required" unless ref $ref;
733 $itoc->{$item} = $ref;
739 # cell reference to item
740 my($self, $refstring, $item) = splice(@_, 0, 3);
741 defined $refstring or croak "cell id required";
742 my $ctoi = $self->_ctoih;
744 $ctoi->{$refstring} = $item;
751 ($self->coords_of(@_))[0];
756 ($self->coords_of(@_))[1];
760 # check/return month...returns name. Accepts month number or string.
762 return $self->month unless @_;
763 my $loc = $self->loc;
766 $m = ($m - 1) % 12 if $m && $m =~ /^\d+$/;
767 $m = $loc->monthname($m) || croak "month not found " . join(', ', @_);
768 return $m if @_ == 1;
775 # check/return month, returns number. Accepts month number or string.
777 my @months = @_ ? @_ : $self->month;
778 my $loc = $self->loc;
780 for my $m (@months) {
781 $m = ($m - 1) % 12 if $m && $m =~ /^\d+$/;
782 $m = $loc->monthnum($m);
783 croak "month not found ", join(', ', @_) unless defined $m;
785 return $m if @_ == 1;
792 # check/return day...returns name. Accepts 1..7, or Su..Sa
794 @_ || croak "day string or num required";
795 my $loc = $self->loc;
799 $d = (($d - 1) % 7) + $self->week_begin - 1;
801 $d = $loc->dayname($d) || croak "day not found ", join(', ', @_);
802 return $d if @_ == 1;
809 # check/return day number 1..7, returns number. Accepts 1..7,
812 @_ || croak "day string or num required";
813 my $loc = $self->loc;
817 $d = (($d - 1) % 7) + $self->week_begin - 1;
819 $d = $loc->daynum($d);
820 croak "day not found ", join(', ', @_) unless defined $d;
822 return $d if @_ == 1;
831 # test day head names
832 my($self, $name) = splice(@_, 0, 2);
833 $name or croak "name missing";
834 return if $name =~ /^\d+$/;
835 $self->daynum($name);
839 # check if an item is a day of the month (1..31)
840 my($self, $item) = splice(@_, 0, 2);
841 croak "item required" unless $item;
842 # can't just invert _headcheck because coords_of() needs _daycheck,
843 # and _headcheck uses coords_of()
844 $item =~ /^\d{1,2}$/ && $item <= 31;
848 # check if an item is a header
852 # constructors/destructors
858 foreach (keys %parms) {
859 if (__PACKAGE__->_is_calmonth_attr($_)) {
860 $attrs{$_} = $parms{$_};
863 $tattrs{$_} = $parms{$_};
867 my $self = CLASS_HET->new(%tattrs);
871 $self->_set_defaults;
873 my $month = delete $attrs{month};
874 my $year = delete $attrs{year};
875 if (!$month || !$year) {
876 my ($nmonth,$nyear) = (localtime(time))[4,5];
877 ++$nmonth; $nyear += 1900;
881 $self->month($month);
885 for my $k (keys %attrs) {
886 $self->$k($attrs{$k}) if defined $attrs{$k};
889 my $loc = CLASS_LOCALE->new(
891 full_days => $self->full_days,
892 full_months => $self->full_months,
893 ) or croak "Problem creating locale " . $self->locale . "\n";
896 my $dt = CLASS_DATETOOL->new(
898 month => $self->month,
899 weeknum => $self->head_week,
900 historic => $self->historic,
901 datetool => $self->datetool,
903 $self->_caltool($dt);
905 $self->week_begin($loc->first_day_of_week + 1)
906 unless defined $attrs{week_begin};
908 my $dom_now = defined $attrs{today} ? $dt->_dom_now(delete $attrs{today})
910 $self->_today($dom_now);
911 $self->today($dom_now) if $dom_now > 0;
913 my $alias = $attrs{alias} || {};
914 if ($self->full_days < 0) {
915 my @full = $self->loc->days;
916 my @narrow = $self->loc->narrow_days;
917 for my $i (0 .. $#narrow) {
918 $alias->{$full[$i]} = $narrow[$i];
921 if ($self->full_months < 0) {
922 my @full = $self->loc->months;
923 my @narrow = $self->loc->narrow_months;
924 for my $i (0 .. $#narrow) {
925 $alias->{$full[$i]} = $narrow[$i];
928 $self->alias($alias) if keys %$alias;
930 # for now, this is the only time this will every happen for this
931 # object. It is now 'initialized'.
932 $self->_date($month, $year);
937 ### overrides (our table is static)
940 sub maxrow { shift->SUPER::maxrow }
941 sub maxcol { shift->SUPER::maxcol }
945 use constant row_offset => 0;
946 use constant col_offset => 0;
947 use constant first_col => 0;
948 use constant first_row => 0;
949 use constant first_week_col => 0;
950 use constant last_week_col => 6;
960 HTML::CalendarMonth - Generate and manipulate HTML calendar months
964 use HTML::CalendarMonth;
966 # Using regular HTML::Element creation
967 my $c = HTML::CalendarMonth->new( month => 8, year => 2010 );
970 # Full locale support via DateTime::Locale
971 my $c2 = HTML::CalendarMonth->new(
978 # Full locale support via DateTime::Locale
979 $c3 = HTML::CalendarMonth->new( month => 8, year => 79, locale => 'fr' );
982 # HTML-Tree integration
983 my $tree = HTML::TreeBuilder->parse_file('cal.html');
984 $tree->find_by_attribute(class => 'hcm-calendar')->replace_with($c);
985 print $tree->as_HTML;
987 # clean up if you're not done, HTML::Element structures must be
989 $c->delete; $c2->delete;
993 HTML::CalendarMonth is a subclass of HTML::ElementTable. See
994 L<HTML::ElementTable(3)> for how that class works, for it affects this
995 module on many levels. Like HTML::ElementTable, HTML::CalendarMonth is
996 an enhanced HTML::Element with methods added to facilitate the
997 manipulation of the calendar table elements as a whole.
999 The primary interaction with HTML::CalendarMonth is through I<items>
1000 rather than cell coordinates like HTML::ElementTable uses. An I<item> is
1001 merely a string that represents the content of the cell of interest
1002 within the calendar. For instance, the element representing the 14th day
1003 of the month would be returned by C<$c-E<gt>item(14)>. Similarly, the
1004 element representing the header for Monday would be returned by C<$c-
1005 E<gt>item('Mo')>. If the year happened to by 2010, then C<$c-
1006 E<gt>item(2010)> would return the cell representing the year. Since
1007 years and particular months change frequently, it is probably more
1008 useful to take advantage of the C<month()> and C<year()> methods, which
1009 return their respective values. The following is therefore the same as
1010 explicitly referencing the year: C<$c-E<gt>item($c- E<gt>year())>.
1012 Multiple cells of the calendar can be manipulated as if they were a
1013 single element. For instance, C<$c-E<gt>item(15)-E<gt>attr(class =E<gt>
1014 'fancyday')> would alter the class of the cell representing the 15th. By
1015 the same token, C<$c-E<gt>item(15, 16, 17,
1016 23)-E<gt>attr(class =E<gt> 'fancyday')> would do the same thing for all
1017 cells containing the days passed to the C<item()> method.
1019 Underneath, the calendar is still nothing more than a table structure,
1020 the same as provided by the HTML::ElementTable class. In addition to the
1021 I<item> based access methods above, calendar cells can still be accessed
1022 using row and column grid coordinates using the C<cell()> method
1023 provided by the table class. All coordinate-based methods in the table
1024 class are accessible to the calendar class.
1026 The module includes support for week-of-the-year numbering, arbitrary
1027 1st day of the week definitions, and locale support.
1029 Dates that are beyond the range of the built-in time functions of perl
1030 are handled either by the ncal/cal command, Date::Calc, DateTime, or
1031 Date::Manip. The presence of any one of these utilities and modules will
1032 suffice for these far flung date calculations. One of these utilities
1033 (with the exception of 'cal') is also required if you want to use week-of-
1036 Full locale support is offered via DateTime::Locale. For a full list of
1037 supported locale id's, look at HTML::CalendarMonth::Locale->locales().
1041 All arguments appearing in [brackets] are optional, and do not represent
1042 anonymous array references.
1050 With no arguments, the constructor will return a calendar object
1051 representing the current month with a default appearance. The initial
1052 configuration of the calendar is controlled by special attributes. Non-
1053 calendar related attributes are passed along to HTML::ElementTable. Any
1054 non-table related attributes left after that are passed to HTML::Element
1055 while constructing the E<lt>tableE<gt> tag. See L<HTML::ElementTable> if
1056 you are interested in attributes that can be passed along to that class.
1058 Special Attributes for HTML::CalendarMonth:
1064 1-12, or Jan-Dec. Defaults to current month.
1068 Four digit representation. Defaults to current year.
1072 Specifies whether to display the month header. Default 1.
1076 Specifies whether to display the year header. Default 1.
1080 Specifies whether to display days of the week header. Default 1.
1084 Specifies whether to display the week-of-year numbering. Default 0.
1088 Specifies the id of the locale in which to render the calendar. Default
1089 is 'en_US'. By default, this will also control determine which day is
1090 considered to be the first day of the week. See
1091 L<HTML::CalendarMonth::Locale> for more information. If for some reason
1092 you prefer to use different labels than those provided by C<locale>, see
1093 the C<alias> attribute below.
1097 Specifies whether or not to use full day names or their abbreviated
1098 names. Default is 0, use abbreviated names. Use -1 for 'narrow' mode,
1099 the shortest (not guaranteed to be unique) abbreviations.
1103 Specifies whether or not to use full month names or their abbreviated
1104 names. Default is 1, use full names. Use -1 for 'narrow' mode, the
1105 shortest (not guaranteed to be unique) abbreviations.
1109 Takes a hash reference mapping labels provided by C<locale> to any
1110 custom label you prefer. Lookups, such as C<day('Sun')>, will still use
1111 the locale string, but when the calendar is rendered the aliased value
1116 Specify first day of the week, which can be 1..7, starting with Sunday.
1117 In order to specify Monday, set this to 2, and so on. By default, this
1118 is determined based on the locale.
1122 Set some handy CSS class attributes on elements, enabled by default.
1123 Currently the classes are:
1125 hcm-table Set on the <lt>table<gt> tag of the calendar
1126 hcm-day-head Set on the day-of-week <lt>tr<gt> or <lt>td<gt> tags
1127 hcm-year-head Set on the <lt>td<gt> tag for the year
1128 hcm-month-head Set on the <lt>td<gt> tag for the month
1129 hcm-week-head Set on the <lt>td<gt> tags for the week-of-year
1133 Sets some additional CSS class attributes on elements, disabled by
1134 default. The notion of 'today' is taken either from the system clock
1135 (default) or from the 'today' parameter as provided to new(). Currently
1138 hcm-today Set on the <lt>td<gt> tag for today, if present
1139 hcm-past Set on the <lt>td<gt> tags for prior days, if present
1140 hcm-future Set on the <lt>td<gt> tags for subsequent days, if present
1144 Specify the value for 'today' if different from the local time as
1145 reported by the system clock (the default). If specified as two or less
1146 digits, it is assumed to be one of the days of the month in the current
1147 calendar. If more than two digits, it is assumed to be a epoch time in
1148 seconds. Otherwise it must be given as a string of the form 'YYYY-mm-
1149 dd'. Note that the default value as determined by the system clock uses
1150 localtime rather than gmtime.
1154 This option is ignored for dates that do not exceed the range of the built-
1155 in perl time functions. For dates that B<do> exceed these ranges, this
1156 option specifies the default calculation method. When set, if the 'ncal'
1157 or 'cal' command is available on your system, that will be used rather
1158 than the Date::Calc or Date::Manip modules. This can be an issue since
1159 the date modules blindly extrapolate the Gregorian calendar, whereas
1160 ncal/cal will revert to the Julian calendar during September 1752. If
1161 either ncal or cal are not available on your system, this attribute is
1162 meaningless. Defaults to 1.
1168 =head2 Item Query Methods
1170 The following methods return lists of item *symbols* (28, 29, 'Thu',
1171 ...) that are related in some way to the provided list of items. The
1172 returned symbols may then be used as arguments to the glob methods
1173 detailed further below.
1177 =item row_items(item1, [item2, ...])
1179 Returns all item symbols in rows shared by the provided item symbols.
1181 =item col_items(item1, [item2, ...])
1183 Returns all item symbols in columns shared by the provided item symbols.
1185 =item daycol_items(col_item1, [col_item2, ...])
1187 Same as col_items(), but the returned item symbols are limited to those
1188 that are not header items (month, year, day-of-week).
1190 =item row_of(item1, [item2, ...])
1192 Returns the row indices of rows containing the provided item symbols.
1194 =item col_of(item1, [item2, ...])
1196 Returns the column indices of columns containing the provided
1201 Returns the day number (symbol) of the last day of the month.
1205 Returns the column index for the first day of the month.
1209 Returns a list of all days of the month as numbers.
1213 Returns a list of week-of-year numbers for this month.
1217 Returns a list of all day headers (Su..Sa)
1221 Returns a list of all headers (month, year, dayheaders)
1225 Returns a list of all item symbols (day number, header values) in
1230 Returns the index of the last column of the calendar (note that this
1231 could be the week-of-year column if head_week is enabled).
1233 =item last_day_col()
1235 Returns the index of the last column of the calendar containing days of
1236 the month (same as last_col() unless week-of-year is enabled).
1238 =item first_week_row()
1240 Returns the index of the first row of the calendar containing day items
1241 (ie, the first week).
1245 Returns the index of the last row of the calendar.
1249 Returns the day of month for 'today', if present in the current
1254 Returns a list of days prior to 'today'. If 'today' is in a future
1255 month, all days are returned. If 'today' is in a past month, no days
1260 Returns a list of days after 'today'. If 'today' is in a past
1261 month, all days are returned. If 'today' is in a future month, no
1268 Glob methods return references that are functionally equivalent to an
1269 individual calendar cell. Mostly, they provide item based analogues to
1270 the glob methods provided in HTML::ElementTable. In methods dealing with
1271 rows, columns, and boxes, the globs include empty calendar cells (which
1272 would otherwise need to be accessed through native HTML::ElementTable
1273 methods). The row and column numbers returned by the item methods above
1274 are compatible with the grid based methods in HTML::ElementTable.
1276 For details on how these globs work, check out L<HTML::ElementTable> and
1277 L<HTML::ElementGlob>.
1281 =item item(item1, [item2, ...])
1283 Returns all cells containing the provided item symbols.
1285 =item item_row(item1, [item2, ...])
1287 Returns all cells in all rows occupied by the provided item symbols.
1289 =item item_day_row(item1, [item2, ...])
1291 Same as item_row() except excludes week-of-year cells, if present.
1293 =item item_col(item1, [item2, ...])
1295 Returns all cells in all columns occupied by the provided item symbols.
1297 =item item_daycol(item1, [item2, ...])
1299 Same as item_col() except limits the cells to non header cells.
1301 =item item_week_nums()
1303 Returns all week-of-year cells, if present.
1305 =item item_box(item1a, item1b, [item2a, item2b, ...])
1307 Returns all cells in the boxes defined by the item pairs provided.
1311 Returns all header cells.
1315 Returns all non header cells, including empty cells.
1319 Returns all cells in the calendar, including empty cells.
1323 =head2 Transformation Methods
1325 The following methods provide ways of translating between various item
1326 symbols, coordinates, and other representations.
1330 =item coords_of(item)
1332 Returns the row and column coordinates of the provided item symbol, for
1333 use with the grid based methods in HTML::ElementTable.
1335 =item item_at(row,column)
1337 Returns the item symbol of the item at the provided coordinates, for use
1338 with the item based methods of HTML::CalendarMonth.
1340 =item monthname(monthnum)
1342 Returns the name (item symbol) of the month number provided, where
1343 I<monthnum> can be 1..12.
1345 =item monthnum(monthname)
1347 Returns the number (1..12) of the month name provided. Only a minimal
1348 case-insensitive match on the month name is necessary; the proper item
1349 symbol for the month will be determined from this match.
1351 =item dayname(daynum)
1353 Returns the name (item symbol) of the day of week header for a number of
1354 a day of the week, where I<daynum> is 1..7.
1356 =item daynum(dayname)
1358 Returns the number of the day of the week given the symbolic name for
1363 Returns the number in seconds since the epoch for a given day. The day
1364 must be present in the current calendar.
1368 =head2 Other Methods
1374 Returns a simple style sheet as a string that can be used in an HTML
1375 document in conjunction with the classes assigned to elements when css
1386 Date::Calc, DateTime, or Date::Manip (only if you want week-of-
1387 year numbering or non-contemporary dates on a system without the
1392 Matthew P. Sisk, E<lt>F<sisk@mojotoad.com>E<gt>
1396 Copyright (c) 1998-2010 Matthew P. Sisk. All rights reserved. All wrongs
1397 revenged. This program is free software; you can redistribute it and/or
1398 modify it under the same terms as Perl itself.
1402 A useful page of examples can be found at
1403 http://www.mojotoad.com/sisk/projects/HTML-CalendarMonth.
1405 For information on iso639 standards for abbreviations for language
1406 names, see http://www.loc.gov/standards/iso639-2/englangn.html
1408 HTML::ElementTable(3), HTML::Element(3), perl(1)
1410 =for Pod::Coverage col_offset row_offset item_alias item_aliased last_week_row