Skip to content

Instantly share code, notes, and snippets.

@kadin2048
Created August 3, 2016 17:36
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
Star You must be signed in to star a gist
Save kadin2048/e13ebc710b3db244839d34ac0fa96cbb to your computer and use it in GitHub Desktop.
#!/usr/bin/perl -w
# Blosxom Plugin: calendar
# Author: Todd Larason (jtl@molehill.org)
# Version: 0+1i
# Blosxom Home/Docs/Licensing: http://www.raelity.org/blosxom
# Categories plugin Home/Docs/Licensing:
# http://molelog.molehill.org/blox/Computers/Internet/Web/Blosxom/Calendar/
package calendar;
# --- Configuration Variables ---
# output format
# 'table' -> simple table; simplest, suitable for most people
my $output_format = 'table';
# names in your preferred language
my @monthname = qw/January February March April May June July
August September October November December/;
my @weekdayname = qw/Sun Mon Tue Wed Thu Fri Sat/;
# --- End of Configuration Section ---
use Time::Local;
$calendar = '';
my %days;
sub report_month_start {
my ($year, $month, $monthname) = @_;
my $results = '';
local $_;
if ($output_format eq 'table') {
$results = qq!<table class="calendar"><tr><th colspan="7" class="calendar_month_head">$monthname $year</th></tr>\n<tr>\n!;
$results .= qq!<th class="calendar_day_head">$_</th>\n!
foreach (@weekdayname);
$results .= qq!</tr>\n!;
} else {
warn "Unsupported output_format: $output_format";
}
return $results;
}
sub report_week_start {
return qq!<tr>\n! if ($output_format eq 'table');
return qq!!;
}
sub report_day_noday {
return qq!<td class="calendar_day_noday">&nbsp;</td>\n!
if ($output_format eq 'table');
return qq!!;
}
sub report_day_link {
my ($year, $month, $day) = @_;
return qq!<td class="calendar_day_link"><a href="$blosxom::url/$year/$month/$day">$day</a></td>\n!
if ($output_format eq 'table');
return qq!!;
}
sub report_day_nolink {
my ($year, $month, $day) = @_;
return qq!<td class="calendar_day_nolink">$day</td>\n!
if ($output_format eq 'table');
return qq!!;
}
sub report_week_end {
return qq!</tr>\n! if ($output_format eq 'table');
return qq!!;
}
sub report_month_end {
return qq!</table>\n! if ($output_format eq 'table');
return qq!!;
}
sub days_in_month {
my ($year, $month) = @_;
my $days = (31,28,31,30,31,30,31,31,30,31,30,31)[$month-1];
if ($month == 2 &&
($year % 4 == 0 &&
(($year % 100 != 0) ||
($year %400 == 0)))) {
$days++;
}
return $days;
}
sub build_calendar {
my $results;
my ($now, @now, $monthstart, @monthstart);
my ($year, $month, $day, $days, $wday);
$now = time;
@now = localtime($now);
$year = $now[5] + 1900;
$month = $now[4] + 1;
$days = days_in_month($year, $month);
# XXX this isn't quite right in the face of daylight savings time
# $monthstart = $now - ($now[3]-1)*86400;
$monthstart = timelocal(0,0,0,1,$month-1,$year-1900);
@monthstart = localtime($monthstart);
$results = report_month_start($year, $month, $monthname[$month-1]);
# First, skip over the first partial week (possibly empty)
# before the month started
for ($wday = 0; $wday < $monthstart[6]; $wday++) {
$results .= report_week_start() if ($wday == 0);
$results .= report_day_noday();
}
# now do the month itself
for ($day = 1; $day <= $days; $day++) {
$results .= report_week_start() if ($wday == 0);
if ($days{"$year/$month/$day"}) {
$results .= report_day_link($year, $month, $day);
} else {
$results .= report_day_nolink($year, $month, $day);
}
if (++$wday == 7) {
$wday = 0;
$results .= report_week_end();
}
}
# and finish up the last week, if any left
if ($wday) {
while (++$wday <= 7) {
$results .= report_day_noday();
}
$results .= report_week_end();
}
$results .= report_month_end();
return $results;
}
sub start {
return 1;
}
sub filter {
my ($pkg, $files) = @_;
foreach (keys %{$files}) {
my @date = localtime($files->{$_});
my $mday = $date[3];
my $month = $date[4] + 1;
my $year = $date[5] + 1900;
$days{"$year"}++;
$days{"$year/$month"}++;
$days{"$year/$month/$mday"}++;
}
$calendar = build_calendar();
}
1;
@kadin2048
Copy link
Author

The "Calendar" plugin for Blosxom was originally hosted at Molehill.org but that whole site has succumbed to URLrot. I salvaged it from the Internet Archive Wayback Machine and this was the current version of the Calendar Plugin as of 21 Feb 2003. It is being mirrored here for posterity.

@kadin2048
Copy link
Author

There are apparently newer versions, up through "0+5i", but I can't find any of them on the Archive.

@kadin2048
Copy link
Author

I found a newer version and started mirroring it plus associated documentation in a legitimate Github project rather than a Gist. Please see https://github.com/kadin2048/blosxom-calendar instead.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment