calendar plugin: Autocreate archive pages if needed

master
Louis 2014-06-18 18:38:33 +02:00
parent 236c63d5b6
commit 2a5e8e72a0
4 changed files with 149 additions and 14 deletions

View File

@ -27,9 +27,11 @@ my $time=time;
my @now=localtime($time);
sub import {
hook(type => "checkconfig", id => "calendar", call => \&checkconfig);
hook(type => "getsetup", id => "calendar", call => \&getsetup);
hook(type => "needsbuild", id => "calendar", call => \&needsbuild);
hook(type => "preprocess", id => "calendar", call => \&preprocess);
hook(type => "scan", id => "calendar", call => \&scan);
}
sub getsetup () {
@ -49,11 +51,41 @@ sub getsetup () {
archive_pagespec => {
type => "pagespec",
example => "page(posts/*) and !*/Discussion",
description => "PageSpec of pages to include in the archives; used by ikiwiki-calendar command",
description => "PageSpec of pages to include in the archives, if option `calendar_autocreate` is true.",
link => 'ikiwiki/PageSpec',
safe => 1,
rebuild => 0,
},
calendar_autocreate => {
type => "boolean",
example => 1,
description => "autocreate new calendar pages?",
safe => 1,
rebuild => undef,
},
calendar_autocreate_commit => {
type => "boolean",
example => 1,
default => 1,
description => "commit autocreated calendar pages",
safe => 1,
rebuild => 0,
},
}
sub checkconfig () {
if (! defined $config{calendar_autocreate}) {
$config{calendar_autocreate} = defined $config{archivebase} || defined $config{calendar_autocreate_commit};
}
if (! defined $config{calendar_autocreate_commit}) {
$config{calendar_autocreate_commit} = 1;
}
if (! defined $config{archive_pagespec}) {
$config{archive_pagespec} = '*';
}
if (! defined $config{archivebase}) {
$config{archivebase} = 'archives';
}
}
sub is_leap_year (@) {
@ -70,6 +102,85 @@ sub month_days {
return $days_in_month;
}
sub autocreate {
my ($page, $pagefile, $year, $month) = @_;
my $message=sprintf(gettext("creating calendar page %s"), $page);
debug($message);
my $template;
if (defined $month) {
$template=template("calendarmonth.tmpl");
} else {
$template=template("calendaryear.tmpl");
}
$template->param(year => $year);
$template->param(month => $month) if defined $month;
$template->param(pagespec => $config{archive_pagespec});
my $dir = $config{srcdir};
if (! $config{calendar_autocreate_commit}) {
$dir = $IkiWiki::Plugin::transient::transientdir;
}
writefile($pagefile, $dir, $template->output);
if ($config{rcs} && $config{calendar_autocreate_commit}) {
IkiWiki::disable_commit_hook();
IkiWiki::rcs_add($pagefile);
IkiWiki::rcs_commit_staged(message => $message);
IkiWiki::enable_commit_hook();
}
}
sub calendarlink($;$) {
my ($year, $month) = @_;
if (defined $month) {
return $config{archivebase} . "/" . $year . "/" . $month;
} else {
return $config{archivebase} . "/" . $year;
}
}
sub gencalendaryear {
my $year = shift;
if ($config{calendar_autocreate}) {
# Building year page
my $page = calendarlink($year);
my $pagefile = newpagefile($page, $config{default_pageext});
add_autofile(
$pagefile, "calendar",
sub {return autocreate($page, $pagefile, $year);}
);
# Building month pages
foreach my $month (qw{01 02 03 04 05 06 07 08 09 10 11 12}) {
my $page = calendarlink($year, $month);
my $pagefile = newpagefile($page, $config{default_pageext});
add_autofile(
$pagefile, "calendar",
sub {return autocreate($page, $pagefile, $year, $month);}
);
}
# Filling potential gaps in years (e.g. calendar goes from 2010 to 2014,
# and we just added year 2005. We have to had years 2006 to 2009.
if (not exists $wikistate{calendar}{minyear}) {
$wikistate{calendar}{minyear} = $year;
} elsif ($wikistate{calendar}{minyear} > $year) {
gencalendaryear($year + 1);
$wikistate{calendar}{minyear} -= 1;
}
if (not exists $wikistate{calendar}{maxyear}) {
$wikistate{calendar}{maxyear} = $year;
}
if ($wikistate{calendar}{maxyear} < $year) {
gencalendaryear($year - 1);
$wikistate{calendar}{maxyear} += 1;
}
}
}
sub format_month (@) {
my %params=@_;
@ -274,7 +385,7 @@ EOF
sub format_year (@) {
my %params=@_;
my @post_months;
foreach my $p (pagespec_match_list($params{page},
"creation_year($params{year}) and ($params{pages})",
@ -508,7 +619,19 @@ sub needsbuild (@) {
}
}
}
return $needsbuild;
}
sub scan (@) {
my %params=@_;
my $page=$params{page};
# Check if year pages have to be generated
if (pagespec_match($page, $config{archive_pagespec})) {
my @ctime = localtime($IkiWiki::pagectime{$page});
gencalendaryear($ctime[5]+1900);
}
}
1

View File

@ -46,6 +46,13 @@ An example crontab:
This command uses two [[templates]] to generate
the pages, `calendarmonth.tmpl` and `calendaryear.tmpl`.
# [[plugins/calendar]] setup option
Most of the goals of this command can be replaced by setting up
`calendar_autocreate` setup option (of plugin [[plugins/calendar]]), and
running `ikiwiki -setup you.setup`. The only thing that `ikiwiki-calendar` can
do and that `ikiwiki` cannot is forcing page generation (using `-f` switch).
# AUTHOR
Joey Hess <joey@ikiwiki.info>

View File

@ -25,14 +25,8 @@ in the sidebar, you'll also need to create these archive pages. They
typically use this directive to display a calendar, and also use [[inline]]
to display or list pages created in the given time frame.
The `ikiwiki-calendar` command can be used to automatically generate the
archive pages. It also refreshes the wiki, updating the calendars to
highlight the current day. This command is typically run at midnight from
cron.
An example crontab:
0 0 * * * ikiwiki-calendar ~/ikiwiki.setup "posts/* and !*/Discussion"
The `calendar_autocreate` [[setup option|plugins/calendar]] can be used to
automatically generate the archive pages.
## usage
@ -45,7 +39,7 @@ An example crontab:
for the whole wiki by setting `archivebase` in ikiwiki's setup file.
Calendars link to pages under here, with names like "2010/04" and
"2010". These pages can be automatically created using the
`ikiwiki-calendar` program.
`calendar_autocreate` [[setup option|plugins/calendar]].
* `year` - The year for which the calendar is requested. Defaults to the
current year. Can also use -1 to refer to last year, and so on.
* `month` - The numeric month for which the calendar is requested, in the

View File

@ -1,11 +1,22 @@
[[!template id=plugin name=calendar author="[[ManojSrivastava]]"]]
[[!tag type/widget]]
This plugin provides a [[ikiwiki/directive/calendar]] [[ikiwiki/directive]].
The directive displays a calendar, similar to the typical calendars shown on
some blogs.
The [[ikiwiki-calendar]] command is used to keep the calendar up-to-date.
The [[ikiwiki-calendar]] command is used to force generating year and month
pages from templates (overriding the existing ones).
## Setup options
* `archivebase` - Default value for [[ikiwiki/directive/calendar]] directive
option of the same name.
* `archive_pagespec` - [[ikiwiki/PageSpec]] of pages to include in the
archives, if option `calendar_autocreate` is on. It defaults to `*`.
* `calendar_autocreate` - Control whether new archive pages are created as
needed. It defaults to being done only if (at least) one of options
`archivebase` and `calendar_autocreate_commit` are set.
* `calendar_autocreate_commit` - If set, causes new archive pages to be
checked into version control. Defaults to 1.
## CSS