fix date_of_page()
authorJulien Moutinho <julm+ikiwiki+events@autogeree.net>
Mon, 7 Apr 2014 23:50:09 +0000 (01:50 +0200)
committerJulien Moutinho <julm+ikiwiki+events@autogeree.net>
Mon, 7 Apr 2014 23:50:09 +0000 (01:50 +0200)
events.pm

index ff3a539..51c176d 100644 (file)
--- a/events.pm
+++ b/events.pm
@@ -155,11 +155,15 @@ sub date_of_page ($%) {
        my $dir = IkiWiki::dirname($page);
        my ($year, $month, $day, $hour, $hour_begin, $hour_end)
         = $dir =~ m{
-               .*/
-               (\d+)/
-               (01|02|03|04|05|06|07|08|09|10|11|12)/
-               (01|02|03|04|05|06|07|08|09|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31)/
-               (([0-2][0-9]h[0-5][0-9])(-[0-2][0-9]h[0-5][0-9])?)?
+               .*?
+               /(\d+)
+               (?:/(01|02|03|04|05|06|07|08|09|10|11|12)
+                       (?:/(01|02|03|04|05|06|07|08|09|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31)
+                               (?:/(([0-2][0-9]h[0-5][0-9])
+                                       (?:-([0-2][0-9]h[0-5][0-9]))?)
+                               )?
+                       )?
+               )?
                $
         }x;
        my $r =
@@ -174,13 +178,13 @@ sub date_of_page ($%) {
        return $r;
  }
 sub event_of_page ($%) {
-       my ($event, %params) = @_;
+       my ($event, $date, %params) = @_;
        my $title
         = exists $pagestate{$event}{meta}{title}
         ? $pagestate{$event}{meta}{title}
         : pagetitle(IkiWiki::basename($event));
        my $hour
-        = date_of_page($event)->{hour};
+        = $date->{hour};
        my $link
         = htmllink
         ( $params{page}
@@ -223,6 +227,8 @@ sub event_of_page ($%) {
        $base =~ s/[^a-zA-Z0-9-]/_/g;
        return
         { hour => $hour
+        , page => $event
+        , date => $date
         , link => $link
         , tags => \@tags
         , base => $base };
@@ -235,16 +241,16 @@ sub events_of_pages ($%) {
        foreach my $page (@$pages) {
                my $date = date_of_page($page);
                if (defined $date->{hour}) {
-                       push @hour_events, $page;
+                       push @hour_events, {page=>$page, date=>$date};
                 }
                else {
-                       push @day_events, $page;
+                       push @day_events, {page=>$page, date=>$date};
                 }
         }
        return
-        map {event_of_page($_, %params)}
-        ( (sort {lc $pagedir->($a) cmp lc $pagedir->($b)} @day_events)
-        , (sort {lc $pagedir->($a) cmp lc $pagedir->($b)} @hour_events) );
+        map {event_of_page($_->{page}, $_->{date}, %params)}
+        ( (sort {lc IkiWiki::basename($a->{page}) cmp lc IkiWiki::basename($b->{page})} @day_events)
+        , (sort {lc $a->{hour}.'/'.IkiWiki::basename($a->{page}) cmp lc $b->{hour}.'/'.IkiWiki::basename($b->{page})} @hour_events) );
  }
 sub event_html ($$%) {
        my ($date, $format, %params) = @_;
@@ -408,15 +414,9 @@ sub preprocess_month (@) {
                # NOTE: add presence dependencies to update calendar when pages are added/removed
         );
        
-       # NOTE: sort the pages by days of the month
-       my %days = map {($_=>[])} (1 .. $last_day);
-       foreach my $page (@pages) {
-               my $page_ctime = DateTime->from_epoch
-                ( epoch     => $IkiWiki::pagectime{$page}
-                , time_zone => 'local'
-                , locale    => $config{locale}
-                );
-               push @{$days{$page_ctime->day()}}, $page;
+       my %events_by_day = map {($_=>[])} (1 .. $last_day);
+       foreach my $event (events_of_pages(\@pages, %params)) {
+               push @{$events_by_day{$event->{date}->{day}}}, $event;
         }
        
        my $t='<tr>';
@@ -448,7 +448,7 @@ sub preprocess_month (@) {
                         . "<ul class='tags'>".join("", @tags)."</ul>"
                         . "</li>\n"
                 }
-                events_of_pages($days{$day->day()}, %params);
+                @{$events_by_day{sprintf('%02d',$day->day())}};
                $t .=
                 "<span class='head'>"
                         . "<span class='day'>"
@@ -496,6 +496,10 @@ sub preprocess_month (@) {
 sub preprocess (@) {
        my %params = @_;
        $params{focus} = $now->clone;
+       $params{focus}->set_hour(0);
+       $params{focus}->set_minute(0);
+       $params{focus}->set_second(0);
+       $params{focus}->set_nanosecond(0);
        
        $params{pages} = "*"        unless defined $params{pages};
        $params{type}  = "month"    unless defined $params{type};