work around CGI::Session constructor issues
[ikiwiki] / IkiWiki / Plugin / prettydate.pm
1 #!/usr/bin/perl
2 package IkiWiki::Plugin::prettydate;
3 use IkiWiki 2.00;
4 use warnings;
5 no warnings 'redefine';
6 use strict;
7
8 sub default_timetable {
9         # Blanks duplicate the time before.
10         return [
11                 #translators: These descriptions of times of day are used
12                 #translators: in messages like "last edited <description>".
13                 #translators: %A is the name of the day of the week, while
14                 #translators: %A- is the name of the previous day.
15                 gettext("late %A- night"),                      # 12
16                 "",                                             # 1
17                 gettext("in the wee hours of %A- night"),       # 2
18                 "",                                             # 3
19                 "",                                             # 4
20                 gettext("terribly early %A morning"),           # 5
21                 "",                                             # 6
22                 gettext("early %A morning"),                    # 7
23                 "",                                             # 8
24                 "",                                             # 9
25                 gettext("mid-morning %A"),                      # 10
26                 gettext("late %A morning"),                     # 11
27                 gettext("at lunch time on %A"),                 # 12
28                 "",                                             # 1
29                 gettext("%A afternoon"),                        # 2
30                 "",                                             # 3
31                 "",                                             # 4
32                 gettext("late %A afternoon"),                   # 5
33                 gettext("%A evening"),                          # 6
34                 "",                                             # 7
35                 gettext("late %A evening"),                     # 8
36                 "",                     # 9                     # 9
37                 gettext("%A night"),                            # 10
38                 "",                                             # 11
39         ];
40 }
41
42 sub import { #{{{
43         hook(type => "checkconfig", id => "prettydate", call => \&checkconfig);
44 } # }}}
45
46 sub checkconfig () { #{{{
47         if (! defined $config{prettydateformat} ||
48             $config{prettydateformat} eq '%c') {
49                 $config{prettydateformat}='%X, %B %o, %Y';
50         }
51
52         if (! ref $config{timetable}) {
53                 $config{timetable}=default_timetable();
54         }
55
56         # Fill in the blanks.
57         for (my $h=0; $h < 24; $h++) {
58                 if (! length $config{timetable}[$h]) {
59                         $config{timetable}[$h] = $config{timetable}[$h - 1];
60                 }
61         }
62 } #}}}
63
64 sub IkiWiki::displaytime ($;$) { #{{{
65         my $time=shift;
66         my $format=shift;
67         if (! defined $format) {
68                 $format=$config{prettydateformat};
69         }
70         
71         eval q{use Date::Format};
72         error($@) if $@;
73
74         my @t=localtime($time);
75         my ($h, $m, $wday)=@t[2, 1, 6];
76         my $t;
77         if ($h == 16 && $m < 30) {
78                 $t = gettext("at teatime on %A");
79         }
80         elsif (($h == 0 && $m < 30) || ($h == 23 && $m > 50)) {
81                 # well, at 40 minutes it's more like the martian timeslip..
82                 $t = gettext("at midnight");
83         }
84         elsif (($h == 12 && $m < 15) || ($h == 11 && $m > 50)) {
85                 $t = gettext("at noon on %A");
86         }
87         # TODO: sunrise and sunset, but to be right I need to do it based on
88         # lat and long, and calculate the appropriate one for the actual
89         # time of year using Astro::Sunrise. Not tonight, it's wee hours
90         # already..
91         else {
92                 $t = $config{timetable}[$h];
93                 if (! length $t) {
94                         $t = "sometime";
95                 }
96         }
97
98         $t=~s{\%A-}{my @yest=@t; $yest[6]--; strftime("%A", \@yest)}eg;
99
100         $format=~s/\%X/$t/g;
101         return strftime($format, \@t);
102 } #}}}
103
104 1