]> sipb.mit.edu Git - ikiwiki.git/blob - IkiWiki/Plugin/prettydate.pm
Merge branch 'master' into autoconfig
[ikiwiki.git] / 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 => "getsetup", id => "prettydate", call => \&getsetup);
44         hook(type => "checkconfig", id => "prettydate", call => \&checkconfig);
45 } # }}}
46
47 sub getsetup () { #{{{
48         return
49                 prettydateformat => {
50                         type => "string",
51                         example => '%X, %B %o, %Y',
52                         description => "format to use to display date",
53                         safe => 1,
54                         rebuild => 1,
55                 },
56                 timetable => {
57                         type => "internal",
58                         description => "array of time descriptions",
59                         safe => 1,
60                         rebuild => 1,
61                 },
62 } #}}}
63
64 sub checkconfig () { #{{{
65         if (! defined $config{prettydateformat} ||
66             $config{prettydateformat} eq '%c') {
67                 $config{prettydateformat}='%X, %B %o, %Y';
68         }
69
70         if (! ref $config{timetable}) {
71                 $config{timetable}=default_timetable();
72         }
73
74         # Fill in the blanks.
75         for (my $h=0; $h < 24; $h++) {
76                 if (! length $config{timetable}[$h]) {
77                         $config{timetable}[$h] = $config{timetable}[$h - 1];
78                 }
79         }
80 } #}}}
81
82 sub IkiWiki::displaytime ($;$) { #{{{
83         my $time=shift;
84         my $format=shift;
85         if (! defined $format) {
86                 $format=$config{prettydateformat};
87         }
88         
89         eval q{use Date::Format};
90         error($@) if $@;
91
92         my @t=localtime($time);
93         my ($h, $m, $wday)=@t[2, 1, 6];
94         my $t;
95         if ($h == 16 && $m < 30) {
96                 $t = gettext("at teatime on %A");
97         }
98         elsif (($h == 0 && $m < 30) || ($h == 23 && $m > 50)) {
99                 # well, at 40 minutes it's more like the martian timeslip..
100                 $t = gettext("at midnight");
101         }
102         elsif (($h == 12 && $m < 15) || ($h == 11 && $m > 50)) {
103                 $t = gettext("at noon on %A");
104         }
105         # TODO: sunrise and sunset, but to be right I need to do it based on
106         # lat and long, and calculate the appropriate one for the actual
107         # time of year using Astro::Sunrise. Not tonight, it's wee hours
108         # already..
109         else {
110                 $t = $config{timetable}[$h];
111                 if (! length $t) {
112                         $t = "sometime";
113                 }
114         }
115
116         $t=~s{\%A-}{my @yest=@t; $yest[6]--; strftime("%A", \@yest)}eg;
117
118         $format=~s/\%X/$t/g;
119         return strftime($format, \@t);
120 } #}}}
121
122 1