use vars qw{%config %links %oldlinks %pagemtime %pagectime %pagecase
%pagestate %wikistate %renderedfiles %oldrenderedfiles
- %pagesources %destsources %depends %hooks %forcerebuild
- %loaded_plugins};
+ %pagesources %destsources %depends %depends_simple %hooks
+ %forcerebuild %loaded_plugins};
use Exporter q{import};
our @EXPORT = qw(hook debug error template htmlpage add_depends pagespec_match
memoize("abs2rel");
memoize("pagespec_translate");
memoize("file_pruned");
+memoize("template_file");
sub getsetup () {
wikiname => {
safe => 0, # path
rebuild => 1,
},
+ templatedirs => {
+ type => "internal",
+ default => [],
+ description => "additional directories containing template files",
+ safe => 0,
+ rebuild => 0,
+ },
underlaydir => {
type => "string",
default => "$installdir/share/ikiwiki/basewiki",
qr/\.x?html?$/, qr/\.ikiwiki-new$/,
qr/(^|\/).svn\//, qr/.arch-ids\//, qr/{arch}\//,
qr/(^|\/)_MTN\//, qr/(^|\/)_darcs\//,
- qr/\.dpkg-tmp$/],
+ qr/(^|\/)CVS\//, qr/\.dpkg-tmp$/],
description => "regexps of source files to ignore",
safe => 0,
rebuild => 1,
},
web_commit_regexp => {
type => "internal",
- default => qr/^web commit (by (.*?(?=: |$))|from (\d+\.\d+\.\d+\.\d+)):?(.*)/,
+ default => qr/^web commit (by (.*?(?=: |$))|from ([0-9a-fA-F:.]+[0-9a-fA-F])):?(.*)/,
description => "regexp to parse web commits from logs",
safe => 0,
rebuild => 0,
}
if ($config{rcs}) {
- if (exists $IkiWiki::hooks{rcs}) {
+ if (exists $hooks{rcs}) {
error(gettext("cannot use multiple rcs plugins"));
}
loadplugin($config{rcs});
}
- if (! exists $IkiWiki::hooks{rcs}) {
+ if (! exists $hooks{rcs}) {
loadplugin("norcs");
}
return;
}
+my %pagename_cache;
+
sub pagename ($) {
my $file=shift;
+ if (exists $pagename_cache{$file}) {
+ return $pagename_cache{$file};
+ }
+
my $type=pagetype($file);
my $page=$file;
$page=~s/\Q.$type\E*$//
if ($config{indexpages} && $page=~/(.*)\/index$/) {
$page=$1;
}
+
+ $pagename_cache{$file} = $page;
return $page;
}
%oldrenderedfiles=%pagectime=();
if (! $config{rebuild}) {
%pagesources=%pagemtime=%oldlinks=%links=%depends=
- %destsources=%renderedfiles=%pagecase=%pagestate=();
+ %destsources=%renderedfiles=%pagecase=%pagestate=
+ %depends_simple=();
}
my $in;
if (! open ($in, "<", "$config{wikistatedir}/indexdb")) {
$links{$page}=$d->{links};
$oldlinks{$page}=[@{$d->{links}}];
}
+ if (exists $d->{depends_simple}) {
+ $depends_simple{$page}={
+ map { $_ => 1 } @{$d->{depends_simple}}
+ };
+ }
if (exists $d->{dependslist}) {
- $depends{$page}=$d->{dependslist};
+ $depends{$page}={
+ map { $_ => 1 } @{$d->{dependslist}}
+ };
}
elsif (exists $d->{depends}) {
- $depends{$page}=[$d->{depends}];
+ $depends{$page}={$d->{depends} => 1};
}
if (exists $d->{state}) {
$pagestate{$page}=$d->{state};
};
if (exists $depends{$page}) {
- $index{page}{$src}{dependslist} = $depends{$page};
+ $index{page}{$src}{dependslist} = [ keys %{$depends{$page}} ];
+ }
+
+ if (exists $depends_simple{$page}) {
+ $index{page}{$src}{depends_simple} = [ keys %{$depends_simple{$page}} ];
}
if (exists $pagestate{$page}) {
sub template_file ($) {
my $template=shift;
- foreach my $dir ($config{templatedir}, "$installdir/share/ikiwiki/templates") {
+ foreach my $dir ($config{templatedir}, @{$config{templatedirs}},
+ "$installdir/share/ikiwiki/templates") {
return "$dir/$template" if -e "$dir/$template";
}
return;
my $page=shift;
my $pagespec=shift;
- return unless pagespec_valid($pagespec);
-
- if (! exists $depends{$page}) {
- $depends{$page}=[$pagespec];
- }
- else {
- foreach my $p (@{$depends{$page}}) {
- return 1 if $p eq $pagespec;
- }
- push @{$depends{$page}}, $pagespec;
+ if ($pagespec =~ /$config{wiki_file_regexp}/ &&
+ $pagespec !~ /[\s*?()!]/) {
+ # a simple dependency, which can be matched by string eq
+ $depends_simple{$page}{lc $pagespec} = 1;
+ return 1;
}
+ return unless pagespec_valid($pagespec);
+
+ $depends{$page}{$pagespec} = 1;
return 1;
}
unless grep { $_ eq $link } @{$links{$page}};
}
-sub pagespec_merge ($$) {
- my $a=shift;
- my $b=shift;
-
- return $a if $a eq $b;
- return "($a) or ($b)";
-}
-
sub pagespec_translate ($) {
my $spec=shift;
[^\s()]+ # any other text
)
\s* # ignore whitespace
- }igx) {
+ }gx) {
my $word=$1;
if (lc $word eq 'and') {
$code.=' &&';
else {
return IkiWiki::SuccessReason->new("$page links to page $p matching $link")
if match_glob($p, $link, %params);
- $p=~s/^\///;
+ my ($p_rel)=$p=~/^\/?(.*)/;
$link=~s/^\///;
- return IkiWiki::SuccessReason->new("$page links to page $p matching $link")
- if match_glob($p, $link, %params);
+ return IkiWiki::SuccessReason->new("$page links to page $p_rel matching $link")
+ if match_glob($p_rel, $link, %params);
}
}
return IkiWiki::FailReason->new("$page does not link to $link");