calendar plugin: Autocreate archive pages if needed
parent
236c63d5b6
commit
2a5e8e72a0
|
@ -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
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
Loading…
Reference in New Issue