128 lines
2.9 KiB
Perl
128 lines
2.9 KiB
Perl
#!/usr/bin/perl
|
|
package IkiWiki::Plugin::prettydate;
|
|
use IkiWiki 3.00;
|
|
use warnings;
|
|
no warnings 'redefine';
|
|
use strict;
|
|
|
|
sub default_timetable {
|
|
# Blanks duplicate the time before.
|
|
return [
|
|
#translators: These descriptions of times of day are used
|
|
#translators: in messages like "last edited <description>".
|
|
#translators: %A is the name of the day of the week, while
|
|
#translators: %A- is the name of the previous day.
|
|
gettext("late %A- night"), # 12
|
|
"", # 1
|
|
gettext("in the wee hours of %A- night"), # 2
|
|
"", # 3
|
|
"", # 4
|
|
gettext("terribly early %A morning"), # 5
|
|
"", # 6
|
|
gettext("early %A morning"), # 7
|
|
"", # 8
|
|
"", # 9
|
|
gettext("mid-morning %A"), # 10
|
|
gettext("late %A morning"), # 11
|
|
gettext("at lunch time on %A"), # 12
|
|
"", # 1
|
|
gettext("%A afternoon"), # 2
|
|
"", # 3
|
|
"", # 4
|
|
gettext("late %A afternoon"), # 5
|
|
gettext("%A evening"), # 6
|
|
"", # 7
|
|
gettext("late %A evening"), # 8
|
|
"", # 9
|
|
gettext("%A night"), # 10
|
|
"", # 11
|
|
];
|
|
}
|
|
|
|
sub import {
|
|
hook(type => "getsetup", id => "prettydate", call => \&getsetup);
|
|
hook(type => "checkconfig", id => "prettydate", call => \&checkconfig);
|
|
}
|
|
|
|
sub getsetup () {
|
|
return
|
|
plugin => {
|
|
safe => 1,
|
|
rebuild => 1,
|
|
},
|
|
prettydateformat => {
|
|
type => "string",
|
|
example => '%X, %B %o, %Y',
|
|
description => "format to use to display date",
|
|
advanced => 1,
|
|
safe => 1,
|
|
rebuild => 1,
|
|
},
|
|
timetable => {
|
|
type => "internal",
|
|
description => "array of time descriptions",
|
|
safe => 1,
|
|
rebuild => 1,
|
|
},
|
|
}
|
|
|
|
sub checkconfig () {
|
|
if (! defined $config{prettydateformat} ||
|
|
$config{prettydateformat} eq '%c') {
|
|
$config{prettydateformat}='%X, %B %o, %Y';
|
|
}
|
|
|
|
if (! ref $config{timetable}) {
|
|
$config{timetable}=default_timetable();
|
|
}
|
|
|
|
# Fill in the blanks.
|
|
for (my $h=0; $h < 24; $h++) {
|
|
if (! length $config{timetable}[$h]) {
|
|
$config{timetable}[$h] = $config{timetable}[$h - 1];
|
|
}
|
|
}
|
|
}
|
|
|
|
sub IkiWiki::formattime ($;$) {
|
|
my $time=shift;
|
|
my $format=shift;
|
|
if (! defined $format) {
|
|
$format=$config{prettydateformat};
|
|
}
|
|
|
|
eval q{use Date::Format};
|
|
error($@) if $@;
|
|
|
|
my @t=localtime($time);
|
|
my ($h, $m, $wday)=@t[2, 1, 6];
|
|
my $t;
|
|
if ($h == 16 && $m < 30) {
|
|
$t = gettext("at teatime on %A");
|
|
}
|
|
elsif (($h == 0 && $m < 30) || ($h == 23 && $m > 50)) {
|
|
# well, at 40 minutes it's more like the martian timeslip..
|
|
$t = gettext("at midnight");
|
|
}
|
|
elsif (($h == 12 && $m < 15) || ($h == 11 && $m > 50)) {
|
|
$t = gettext("at noon on %A");
|
|
}
|
|
# TODO: sunrise and sunset, but to be right I need to do it based on
|
|
# lat and long, and calculate the appropriate one for the actual
|
|
# time of year using Astro::Sunrise. Not tonight, it's wee hours
|
|
# already..
|
|
else {
|
|
$t = $config{timetable}[$h];
|
|
if (! length $t) {
|
|
$t = "sometime";
|
|
}
|
|
}
|
|
|
|
$t=~s{\%A-}{my @yest=@t; $yest[6]--; strftime("%A", \@yest)}eg;
|
|
|
|
$format=~s/\%X/$t/g;
|
|
return strftime($format, \@t);
|
|
}
|
|
|
|
1
|