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 =
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}
(keys %{$IkiWiki::typedlinks{$event}{tag}}));
@tags
= map {
- my $tag = $_;
+ my $besttag = bestlink($params{page}, $_);
+ my $tag = (length $besttag > 0 ? $besttag : $_);
my $title
= exists $pagestate{$tag}{meta}{title}
? $pagestate{$tag}{meta}{title}
= htmllink
( $params{page}
, $params{destpage}
- , '/'.$tag
+ , (length $besttag == 0 and defined $config{tag_new} ? $config{tag_new} : '').'/'.$tag
, linktext => $title
, noimageinline => 1
, title => $title );
$base =~ s/[^a-zA-Z0-9-]/_/g;
return
{ hour => $hour
+ , page => $event
+ , date => $date
, link => $link
, tags => \@tags
, base => $base };
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 {
+ my $r = $a->{date}->{hour} cmp $b->{date}->{hour};
+ if ($r) { $r }
+ else { IkiWiki::basename($a->{page}) cmp IkiWiki::basename($b->{page}) }
+ } @hour_events) );
}
sub event_html ($$%) {
my ($date, $format, %params) = @_;
# 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>';
. "<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'>"
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};
? $config{events_base}
: gettext('Agenda');
}
- if (defined $params{day}) {
- if ($params{day} =~ m/^([+-])(\d+)$/) {
- my ($sign, $days) = ($1, $2);
- my $duration = DateTime::Duration->new(days => $days, end_of_month => 'limit');
- $params{focus}
- = $sign eq '+'
- ? $params{focus}->add_duration($duration)
- : $params{focus}->subtract_duration($duration);
- }
- else {
- $params{focus}->set(day => $params{day});
- }
+
+ my %focus_set;
+ if (defined $params{day} and $params{day} =~ m/^(\d+)$/) {
+ my ($day) = ($1);
+ $focus_set{day} = $day;
}
- else {
- #$params{focus}->set(day => 1);
+ if (defined $params{month} and $params{month} =~ m/^(\d+)$/) {
+ my ($month) = ($1);
+ $focus_set{month} = $month;
}
- if (defined $params{month}) {
- if ($params{month} =~ m/^([+-])(\d+)$/) {
- my ($sign, $months) = ($1, $2);
- my $duration = DateTime::Duration->new(months => $months, end_of_month => 'limit');
- $params{focus}
- = $sign eq '+'
- ? $params{focus}->add_duration($duration)
- : $params{focus}->subtract_duration($duration);
- }
- else {
- $params{focus}->set(month => $params{month});
- }
+ if (defined $params{year} and $params{year} =~ m/^(\d+)$/) {
+ my ($year) = ($1);
+ $focus_set{year} = $year;
}
- if (defined $params{year}) {
- if ($params{year} =~ m/^([+-])(\d+)$/) {
- my ($sign, $years) = ($1, $2);
- my $duration = DateTime::Duration->new(years => $years, end_of_month => 'limit');
- $params{focus}
- = $sign eq '+'
- ? $params{focus}->add_duration($duration)
- : $params{focus}->subtract_duration($duration);
- }
- else {
- $params{focus}->set(year => $params{year});
- }
+ $params{focus}->set(%focus_set);
+
+ if (defined $params{day} and $params{day} =~ m/^([+-])(\d+)$/) {
+ my ($sign, $days) = ($1, $2);
+ my $duration = DateTime::Duration->new(days => $days, end_of_month => 'limit');
+ $params{focus}
+ = $sign eq '+'
+ ? $params{focus}->add_duration($duration)
+ : $params{focus}->subtract_duration($duration);
+ }
+ if (defined $params{month} and $params{month} =~ m/^([+-])(\d+)$/) {
+ my ($sign, $months) = ($1, $2);
+ my $duration = DateTime::Duration->new(months => $months, end_of_month => 'limit');
+ $params{focus}
+ = $sign eq '+'
+ ? $params{focus}->add_duration($duration)
+ : $params{focus}->subtract_duration($duration);
+ }
+ if (defined $params{year} and $params{year} =~ m/^([+-])(\d+)$/) {
+ my ($sign, $years) = ($1, $2);
+ my $duration = DateTime::Duration->new(years => $years, end_of_month => 'limit');
+ $params{focus}
+ = $sign eq '+'
+ ? $params{focus}->add_duration($duration)
+ : $params{focus}->subtract_duration($duration);
}
#debug("events: focus=".$params{focus}->strftime('%Y-%m-%d_%H-%M-%S'));
# new
sub tmpl ($$) {
my ($base, $model) = @_;
- my $page = IkiWiki::dirname($base).'/'.'templates/'.$model;
+ my $page = $base.'/'.'templates/'.$model;
my $file = defined srcfile($page, 1) ? '/'.$page : $model;
return template($file);
}