* Use fieldsets in the preferences form to group related options together.
[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("in 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 => "skeleton", 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         
67         eval q{use Date::Format};
68         error($@) if $@;
69
70         my @t=localtime($time);
71         my ($h, $m, $wday)=@t[2, 1, 6];
72         my $t;
73         if ($h == 16 && $m < 30) {
74                 $t = gettext("at teatime on %A");
75         }
76         elsif (($h == 0 && $m < 30) || ($h == 23 && $m > 50)) {
77                 # well, at 40 minutes it's more like the martian timeslip..
78                 $t = gettext("at midnight");
79         }
80         elsif (($h == 12 && $m < 15) || ($h == 11 && $m > 50)) {
81                 $t = gettext("at noon on %A");
82         }
83         # TODO: sunrise and sunset, but to be right I need to do it based on
84         # lat and long, and calculate the appropriate one for the actual
85         # time of year using Astro::Sunrise. Not tonight, it's wee hours
86         # already..
87         else {
88                 $t = $config{timetable}[$h];
89                 if (! length $t) {
90                         $t = "sometime";
91                 }
92         }
93
94         $t=~s{\%A-}{my @yest=@t; $yest[6]--; strftime("%A", \@yest)}eg;
95
96         my $format=$config{prettydateformat};
97         $format=~s/\%X/$t/g;
98         return strftime($format, \@t);
99 } #}}}
100
101 1