Skip to content

Instantly share code, notes, and snippets.

@pen
Created April 30, 2011 20:52
Show Gist options
  • Save pen/949988 to your computer and use it in GitHub Desktop.
Save pen/949988 to your computer and use it in GitHub Desktop.
html calendar
#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use DateTime;
use Text::Xslate;
use Encode;
render_calendar(@ARGV); # cal_html.pl 5 2011
sub render_calendar
{
my ($month, $year) = @_;
my $dt = DateTime->today(time_zone => "Asia/Tokyo");
$dt->set(month => $month) if $month;
$dt->set(year => $year) if $year;
my $vars = { dt => $dt };
my $template = do { local $/; <DATA> };
my $tx = Text::Xslate->new(syntax => "TTerse");
print encode('utf-8', $tx->render_string($template, $vars));
}
__DATA__
<style type="text/css">
<!--
td { text-align: right; }
.dow_6 { background-color: skyblue; }
.dow_7 { background-color: pink; }
.out { color: #999; }
-->
</style>
<table border="1">
<tr>
[% SET day_names = [ "日", "月", "火", "水", "木", "金", "土" ] %]
[% MACRO day_name(dt) BLOCK %][% day_names.${dt.day_of_week % 7} %][% END %]
[% MACRO dowclass(dt) BLOCK %]dow_[% dt.day_of_week %][% END %]
[% SET month = dt.month;
CALL dt.set(day => 1);
CALL dt.subtract(days => dt.day_of_week % 7 + 7);
%]
[% FOR i IN [1..7] %]
<td class="[% dowclass(dt) %]">[% day_name(dt) %]</td>
[% CALL dt.add(days => 1) %]
[% END %]
</tr>
<tr>
[% WHILE dt.month != month %]
<td class="[% dowclass(dt) %] out">[% dt.day %]</td>
[% CALL dt.add(days => 1) %]
[% END %]
[% WHILE dt.month == month %]
[% IF dt.day_of_week == 7 && dt.day != 1 %]</tr><tr>[% END %]
<td class="[% dowclass(dt) %]">[% dt.day %]</td>
[% CALL dt.add(days => 1) %]
[% END %]
[% while dt.day_of_week != 7 %]
<td class="[% dowclass(dt) %] out">[% dt.day %]</td>
[% CALL dt.add(days => 1) %]
[% END %]
</tr>
</table>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment