aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLouis <spalax@gresille.org>2014-06-18 18:38:33 +0200
committerLouis <spalax@gresille.org>2014-06-24 15:17:51 +0200
commit2a5e8e72a0dcefd0a5c0ca844ea108154f892d61 (patch)
tree85460ff45eff220ce29291c76acb5d6ab9050af4
parent236c63d5b68c2fe57a87b952bd9968ff685c86a2 (diff)
downloadikiwiki-2a5e8e72a0dcefd0a5c0ca844ea108154f892d61.tar
ikiwiki-2a5e8e72a0dcefd0a5c0ca844ea108154f892d61.tar.gz
calendar plugin: Autocreate archive pages if needed
-rw-r--r--IkiWiki/Plugin/calendar.pm127
-rw-r--r--doc/ikiwiki-calendar.mdwn7
-rw-r--r--doc/ikiwiki/directive/calendar.mdwn12
-rw-r--r--doc/plugins/calendar.mdwn17
4 files changed, 149 insertions, 14 deletions
diff --git a/IkiWiki/Plugin/calendar.pm b/IkiWiki/Plugin/calendar.pm
index 682bfb6fb..9a3a1584b 100644
--- a/IkiWiki/Plugin/calendar.pm
+++ b/IkiWiki/Plugin/calendar.pm
@@ -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
diff --git a/doc/ikiwiki-calendar.mdwn b/doc/ikiwiki-calendar.mdwn
index d311a1859..fd3244694 100644
--- a/doc/ikiwiki-calendar.mdwn
+++ b/doc/ikiwiki-calendar.mdwn
@@ -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>
diff --git a/doc/ikiwiki/directive/calendar.mdwn b/doc/ikiwiki/directive/calendar.mdwn
index cb40f884e..0b2b475fd 100644
--- a/doc/ikiwiki/directive/calendar.mdwn
+++ b/doc/ikiwiki/directive/calendar.mdwn
@@ -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
diff --git a/doc/plugins/calendar.mdwn b/doc/plugins/calendar.mdwn
index 76e718a3b..efc8ee25c 100644
--- a/doc/plugins/calendar.mdwn
+++ b/doc/plugins/calendar.mdwn
@@ -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