return beautify_urlpath($link);
}
+sub isselflink ($$) {
+ # Plugins can override this function to support special types
+ # of selflinks.
+ my $page=shift;
+ my $link=shift;
+
+ return $page eq $link;
+}
+
sub htmllink ($$$;@) {
my $lpage=shift; # the page doing the linking
my $page=shift; # the page that will contain the link (different for inline)
}
return "<span class=\"selflink\">$linktext</span>"
- if length $bestlink && $page eq $bestlink &&
+ if length $bestlink && isselflink($page, $bestlink) &&
! defined $opts{anchor};
if (! $destsources{$bestlink}) {
if (exists $index->{version} && ! ref $index->{version}) {
$pages=$index->{page};
%wikistate=%{$index->{state}};
+ # Handle plugins that got disabled by loading a new setup.
+ if (exists $config{setupfile}) {
+ require IkiWiki::Setup;
+ IkiWiki::Setup::disabled_plugins(
+ grep { ! $loaded_plugins{$_} } keys %wikistate);
+ }
}
else {
$pages=$index;
sub saveindex () {
run_hooks(savestate => sub { shift->() });
- my %hookids;
- foreach my $type (keys %hooks) {
- $hookids{$_}=1 foreach keys %{$hooks{$type}};
- }
- my @hookids=keys %hookids;
+ my @plugins=keys %loaded_plugins;
if (! -d $config{wikistatedir}) {
mkdir($config{wikistatedir});
}
if (exists $pagestate{$page}) {
- foreach my $id (@hookids) {
+ foreach my $id (@plugins) {
foreach my $key (keys %{$pagestate{$page}{$id}}) {
$index{page}{$src}{state}{$id}{$key}=$pagestate{$page}{$id}{$key};
}
}
$index{state}={};
- foreach my $id (@hookids) {
+ foreach my $id (@plugins) {
+ $index{state}{$id}={}; # used to detect disabled plugins
foreach my $key (keys %{$wikistate{$id}}) {
$index{state}{$id}{$key}=$wikistate{$id}{$key};
}
my $name=shift;
my $tpage=($name =~ s/^\///) ? $name : "templates/$name";
+ my $template;
if ($name !~ /\.tmpl$/ && exists $pagesources{$tpage}) {
- $tpage=$pagesources{$tpage};
+ $template=srcfile($pagesources{$tpage}, 1);
$name.=".tmpl";
}
+ else {
+ $template=srcfile($tpage, 1);
+ }
- my $template=srcfile($tpage, 1);
if (defined $template) {
return $template, $tpage, 1 if wantarray;
return $template;
my $path=shift;
my $from=shift;
- if ($path =~ m!^\./!) {
- $from=~s#/?[^/]+$## if defined $from;
- $path=~s#^\./##;
- $path="$from/$path" if defined $from && length $from;
+ if ($path =~ m!^\.(/|$)!) {
+ if ($1) {
+ $from=~s#/?[^/]+$## if defined $from;
+ $path=~s#^\./##;
+ $path="$from/$path" if defined $from && length $from;
+ }
+ else {
+ $path = $from;
+ $path = "" unless defined $path;
+ }
}
return $path;
sub match_page ($$;@) {
my $page=shift;
my $match=match_glob($page, shift, @_);
- if ($match && ! (exists $IkiWiki::pagesources{$page}
- && defined IkiWiki::pagetype($IkiWiki::pagesources{$page}))) {
- return IkiWiki::FailReason->new("$page is not a page");
- }
- else {
- return $match;
+ if ($match) {
+ my $source=exists $IkiWiki::pagesources{$page} ?
+ $IkiWiki::pagesources{$page} :
+ $IkiWiki::delpagesources{$page};
+ my $type=defined $source ? IkiWiki::pagetype($source) : undef;
+ if (! defined $type) {
+ return IkiWiki::FailReason->new("$page is not a page");
+ }
}
+ return $match;
}
sub match_link ($$;@) {