aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoey Hess <joey@kitenet.net>2010-04-26 18:47:17 -0400
committerJoey Hess <joey@kitenet.net>2010-04-26 18:47:17 -0400
commit3ac2ae1f14952bd92038183d92b1eb618c9d0f55 (patch)
treec07aa8d1dfde0049f9ae414db8fdab54266328b0
parent194824ce293a64f7dce68d568d1f906d675af858 (diff)
downloadikiwiki-3ac2ae1f14952bd92038183d92b1eb618c9d0f55.tar
ikiwiki-3ac2ae1f14952bd92038183d92b1eb618c9d0f55.tar.gz
Add page() PageSpec, which is like glob() but matches only pages, not other files.
-rw-r--r--IkiWiki.pm10
-rw-r--r--debian/changelog2
-rw-r--r--doc/ikiwiki/pagespec.mdwn11
-rwxr-xr-xt/pagespec_match.t16
4 files changed, 32 insertions, 7 deletions
diff --git a/IkiWiki.pm b/IkiWiki.pm
index 944001d9b..623396c9c 100644
--- a/IkiWiki.pm
+++ b/IkiWiki.pm
@@ -2299,7 +2299,11 @@ sub match_glob ($$;@) {
my $regexp=IkiWiki::glob2re($glob);
if ($page=~/^$regexp$/i) {
- if (! IkiWiki::isinternal($page) || $params{internal}) {
+ if ($params{onlypage} &&
+ ! defined IkiWiki::pagetype($IkiWiki::pagesources{$page})) {
+ return IkiWiki::FailReason->new("$page is not a page");
+ }
+ elsif (! IkiWiki::isinternal($page) || $params{internal}) {
return IkiWiki::SuccessReason->new("$glob matches $page");
}
else {
@@ -2315,6 +2319,10 @@ sub match_internal ($$;@) {
return match_glob($_[0], $_[1], @_, internal => 1)
}
+sub match_page ($$;@) {
+ return match_glob($_[0], $_[1], @_, onlypage => 1)
+}
+
sub match_link ($$;@) {
my $page=shift;
my $link=lc(shift);
diff --git a/debian/changelog b/debian/changelog
index 1229b1198..610d0c9cb 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -75,6 +75,8 @@ ikiwiki (3.20100424) UNRELEASED; urgency=low
the top of the web root. This is another things that requires a wiki
rebuild on upgrade to this version.
* Fix removal of rendered files in rebuild mode.
+ * Add page() PageSpec, which is like glob() but matches only pages,
+ not other files.
-- Joey Hess <joeyh@debian.org> Sun, 04 Apr 2010 12:17:11 -0400
diff --git a/doc/ikiwiki/pagespec.mdwn b/doc/ikiwiki/pagespec.mdwn
index 7810e790b..1c99aefac 100644
--- a/doc/ikiwiki/pagespec.mdwn
+++ b/doc/ikiwiki/pagespec.mdwn
@@ -24,19 +24,20 @@ match all pages except for Discussion pages and the SandBox:
Some more elaborate limits can be added to what matches using these functions:
+* "`glob(someglob)`" - matches pages and other files that match the given glob.
+ Just writing the glob by itself is actually a shorthand for this function.
+* "`page(glob)`" - like `glob()`, but only matches pages, not other files
* "`link(page)`" - matches only pages that link to a given page (or glob)
* "`tagged(tag)`" - matches pages that are tagged or link to the given tag (or
tags matched by a glob)
* "`backlink(page)`" - matches only pages that a given page links to
-* "`creation_month(month)`" - matches only pages created on the given month
+* "`creation_month(month)`" - matches only files created on the given month
* "`creation_day(mday)`" - or day of the month
* "`creation_year(year)`" - or year
-* "`created_after(page)`" - matches only pages created after the given page
+* "`created_after(page)`" - matches only files created after the given page
was created
-* "`created_before(page)`" - matches only pages created before the given page
+* "`created_before(page)`" - matches only files created before the given page
was created
-* "`glob(someglob)`" - matches pages that match the given glob. Just writing
- the glob by itself is actually a shorthand for this function.
* "`internal(glob)`" - like `glob()`, but matches even internal-use
pages that globs do not usually match.
* "`title(glob)`", "`author(glob)`", "`authorurl(glob)`",
diff --git a/t/pagespec_match.t b/t/pagespec_match.t
index ade9bca5a..97bcc969c 100755
--- a/t/pagespec_match.t
+++ b/t/pagespec_match.t
@@ -1,7 +1,7 @@
#!/usr/bin/perl
use warnings;
use strict;
-use Test::More tests => 75;
+use Test::More tests => 85;
BEGIN { use_ok("IkiWiki"); }
@@ -66,7 +66,21 @@ $links{"ook"}=[qw{/blog/tags/foo}];
foreach my $p (keys %links) {
$pagesources{$p}="$p.mdwn";
}
+$pagesources{"foo.png"}="foo.png";
+$pagesources{"foo"}="foo.mdwn";
+$IkiWiki::hooks{htmlize}{mdwn}={};
+ok(pagespec_match("foo", "foo"), "simple");
+ok(! pagespec_match("foo", "bar"), "simple fail");
+ok(pagespec_match("foo", "foo"), "simple glob");
+ok(pagespec_match("foo", "f*"), "simple glob fail");
+ok(pagespec_match("foo", "page(foo)"), "page()");
+print pagespec_match("foo", "page(foo)")."\n";
+ok(! pagespec_match("foo", "page(bar)"), "page() fail");
+ok(! pagespec_match("foo.png", "page(foo.png)"), "page() fails on non-page");
+ok(! pagespec_match("foo.png", "page(foo*)"), "page() fails on non-page glob");
+ok(pagespec_match("foo", "page(foo)"), "page() glob");
+ok(pagespec_match("foo", "page(f*)"), "page() glob fail");
ok(pagespec_match("foo", "link(bar)"), "link");
ok(pagespec_match("foo", "link(ba?)"), "glob link");
ok(! pagespec_match("foo", "link(quux)"), "failed link");