From ad247de723cc540aaaae584cdceefaeb06f62284 Mon Sep 17 00:00:00 2001 From: joey Date: Fri, 2 Jun 2006 01:17:26 +0000 Subject: [PATCH] * Patch from Dr. Zini to add link() and backlink() to globlists. This allows for some handy stuff like: - Using links as a kind of tag; creating blog pages that list all pages containing a given tag/link or not containing some other tag. - Subscribing to mail notifications whenever a change is made to a page that is a backlink of page foo. Ie, "Please notify me of changes in all pages that link to my home page in the wiki" - Locking any pages that are linked to from a particular page, so that lists of locks can be exposed in the wiki. --- IkiWiki.pm | 28 +++++++++++++++++++++------- basewiki/blog.mdwn | 17 ++++++++++++++--- basewiki/globlist.mdwn | 4 ++++ debian/changelog | 13 +++++++++++-- doc/features.mdwn | 12 +++++++----- 5 files changed, 57 insertions(+), 17 deletions(-) diff --git a/IkiWiki.pm b/IkiWiki.pm index ce9542f62..357c1cd2d 100644 --- a/IkiWiki.pm +++ b/IkiWiki.pm @@ -401,13 +401,27 @@ sub glob_match ($$) { #{{{ my $page=shift; my $glob=shift; - # turn glob into safe regexp - $glob=quotemeta($glob); - $glob=~s/\\\*/.*/g; - $glob=~s/\\\?/./g; - $glob=~s!\\/!/!g; - - $page=~/^$glob$/i; + if ($glob =~ /^link\((.+)\)$/) { + my $rev = $links{$page} or return undef; + foreach my $p (@$rev) { + return 1 if lc $p eq $1; + } + return 0; + } elsif ($glob =~ /^backlink\((.+)\)$/) { + my $rev = $links{$1} or return undef; + foreach my $p (@$rev) { + return 1 if lc $p eq $page; + } + return 0; + } else { + # turn glob into safe regexp + $glob=quotemeta($glob); + $glob=~s/\\\*/.*/g; + $glob=~s/\\\?/./g; + $glob=~s!\\/!/!g; + + return $page=~/^$glob$/i; + } } #}}} sub globlist_match ($$) { #{{{ diff --git a/basewiki/blog.mdwn b/basewiki/blog.mdwn index 38476d2d6..1276cb1e8 100644 --- a/basewiki/blog.mdwn +++ b/basewiki/blog.mdwn @@ -1,7 +1,7 @@ You can turn any page on this wiki into a weblog by inserting a [[PreProcessorDirective]]. Like this: -\\[[inline pages="blog/* !*/Discussion" show="10" rootpage="blog"]] + \\[[inline pages="blog/* !*/Discussion" show="10" rootpage="blog"]] Any pages that match the specified [[GlobList]] (in the example, any [[SubPage]] of "blog") will be part of the blog, and the newest 10 @@ -14,9 +14,20 @@ top of the blog that can be used to add new items. If you want your blog to have an archive page listing every post ever made to it, you can accomplish that like this: -\\[[inline pages="blog/* !*/Discussion" archive="yes"]] + \\[[inline pages="blog/* !*/Discussion" archive="yes"]] You can even create an automatically generated list of all the pages on the wiki, with the most recently added at the top, like this: -\\[[inline pages="* !*/Discussion" archive="yes"]] + \\[[inline pages="* !*/Discussion" archive="yes"]] + +If you want to be able to add pages to a given blog feed by tagging them, +you can do that too. To tag a page, just make it link to a page or pages +that represent its tags. Then use the special link() [[GlobList]] to match +all pages that have a given tag: + + \\[[inline pages="link(life)"]] + +Or include some tags and exclude others: + + \\[[inline pages="link(debian) !link(social)"]] diff --git a/basewiki/globlist.mdwn b/basewiki/globlist.mdwn index 5255a3bee..20a9eed1b 100644 --- a/basewiki/globlist.mdwn +++ b/basewiki/globlist.mdwn @@ -14,3 +14,7 @@ pages that match it. So if you want to specify all pages except for Discussion pages and the SandBox: * !SandBox !*/Discussion + +It's also possible to match pages that link to a given page, by writing +"link(page)" in a globlist. Or, match pages that a given page links to, by +writing "backlink(page)". diff --git a/debian/changelog b/debian/changelog index bc08036db..c75eb80b7 100644 --- a/debian/changelog +++ b/debian/changelog @@ -4,8 +4,17 @@ ikiwiki (1.5) UNRELEASED; urgency=low Note that as a side effect, dates will now be displayed using the local timezone, not as GMT. * More security review. - - -- Joey Hess Thu, 1 Jun 2006 15:12:29 -0400 + * Patch from Dr. Zini to add link() and backlink() to globlists. This allows + for some handy stuff like: + - Using links as a kind of tag; creating blog pages that list all pages + containing a given tag/link or not containing some other tag. + - Subscribing to mail notifications whenever a change is made to a page + that is a backlink of page foo. Ie, "Please notify me of changes in all + pages that link to my home page in the wiki" + - Locking any pages that are linked to from a particular page, so that + lists of locks can be exposed in the wiki. + + -- Joey Hess Thu, 1 Jun 2006 20:56:58 -0400 ikiwiki (1.4) unstable; urgency=low diff --git a/doc/features.mdwn b/doc/features.mdwn index b58392fd5..ac5dc0375 100644 --- a/doc/features.mdwn +++ b/doc/features.mdwn @@ -37,12 +37,14 @@ Some of ikiwiki's features: * [[blog]]s - You can turn any page in the wiki into a [[blog]]. Pages with names - matching a specified [[GlobList]] will be displayed as a weblog within - the blog page. And an RSS feed can be generated to follow the blog. + You can turn any page in the wiki into a [[blog]]. Pages matching a + specified [[GlobList]] will be displayed as a weblog within the blog + page. And an RSS feed can be generated to follow the blog. - Ikiwiki's own [[TODO]], [[news]], and [[plugins]] pages are good examples of some of - the flexible ways that this can be used. + Ikiwiki's own [[TODO]], [[news]], and [[plugins]] pages are good examples + of some of the flexible ways that this can be used. + + Note that this also includes support for tag-based blogging. * Fast compiler -- 2.32.0.93.g670b81a890