our @EXPORT = qw(hook debug error template htmlpage add_depends pagespec_match
bestlink htmllink readfile writefile pagetype srcfile pagename
displaytime will_render gettext urlto targetpage
+ add_underlay
%config %links %renderedfiles %pagesources %destsources);
our $VERSION = 2.00; # plugin interface version, next is ikiwiki version
our $version='unknown'; # VERSION_AUTOREPLACE done by Makefile, DNE
wiki_link_regexp => qr{
\[\[ # beginning of link
(?:
- ([^\]\|]+) # 1: link text
+ ([^\]\|\n\s]+) # 1: link text
\| # followed by '|'
)? # optional
pingurl => [],
templatedir => "$installdir/share/ikiwiki/templates",
underlaydir => "$installdir/share/ikiwiki/basewiki",
+ underlaydirs => [],
setup => undef,
adminuser => undef,
adminemail => undef,
require IkiWiki::Rcs::Stub;
}
+ if (exists $config{umask}) {
+ umask(possibly_foolish_untaint($config{umask}));
+ }
+
run_hooks(checkconfig => sub { shift->() });
return 1;
my $file=shift;
return "$config{srcdir}/$file" if -e "$config{srcdir}/$file";
- return "$config{underlaydir}/$file" if -e "$config{underlaydir}/$file";
- error("internal error: $file cannot be found in $config{srcdir} or $config{underlaydir}");
+ foreach my $dir (@{$config{underlaydirs}}, $config{underlaydir}) {
+ return "$dir/$file" if -e "$dir/$file";
+ }
+ error("internal error: $file cannot be found in $config{srcdir} or underlay");
return;
} #}}}
+sub add_underlay ($) { #{{{
+ my $dir=shift;
+
+ if ($dir=~/^\//) {
+ unshift @{$config{underlaydirs}}, $dir;
+ }
+ else {
+ unshift @{$config{underlaydirs}}, "$config{underlaydir}/../$dir";
+ }
+
+ return 1;
+} #}}}
+
sub readfile ($;$$) { #{{{
my $file=shift;
my $binary=shift;
# absolute links
$cwd="";
}
+ $link=~s/\/$//;
do {
my $l=$cwd;
return $ret;
} #}}}
-sub displaytime ($) { #{{{
+sub displaytime ($;$) { #{{{
my $time=shift;
+ my $format=shift;
+ if (! defined $format) {
+ $format=$config{timeformat};
+ }
# strftime doesn't know about encodings, so make sure
# its output is properly treated as utf8
- return decode_utf8(POSIX::strftime(
- $config{timeformat}, localtime($time)));
+ return decode_utf8(POSIX::strftime($format, localtime($time)));
} #}}}
sub beautify_url ($) { #{{{
my $url=shift;
- $url =~ s!/index.$config{htmlext}$!/!;
+ if ($config{usedirs}) {
+ $url =~ s!/index.$config{htmlext}$!/!;
+ }
$url =~ s!^$!./!; # Browsers don't like empty links...
return $url;
my $link=shift;
my %opts=@_;
+ $link=~s/\/$//;
+
my $bestlink;
if (! $opts{forcesubpage}) {
$bestlink=bestlink($lpage, $link);
}
return "<span class=\"selflink\">$linktext</span>"
- if length $bestlink && $page eq $bestlink;
+ if length $bestlink && $page eq $bestlink &&
+ ! defined $opts{anchor};
if (! $destsources{$bestlink}) {
$bestlink=htmlpage($bestlink);
if (! $destsources{$bestlink}) {
return $linktext unless length $config{cgiurl};
- return "<span><a href=\"".
+ return "<span class=\"createlink\"><a href=\"".
cgiurl(
do => "create",
page => pagetitle(lc($link), 1),
if (defined $opts{rel}) {
push @attrs, ' rel="'.$opts{rel}.'"';
}
+ if (defined $opts{class}) {
+ push @attrs, ' class="'.$opts{class}.'"';
+ }
return "<a href=\"$bestlink\"@attrs>$linktext</a>";
} #}}}
} #}}}
sub unlockwiki () { #{{{
- return close($wikilock);
+ return close($wikilock) if $wikilock;
+ return;
} #}}}
my $commitlock;
} #}}}
sub enable_commit_hook () { #{{{
- return close($commitlock);
+ return close($commitlock) if $commitlock;
+ return;
} #}}}
sub loadindex () { #{{{
+ %oldrenderedfiles=%pagectime=();
+ if (! $config{rebuild}) {
+ %pagesources=%pagemtime=%oldlinks=%links=%depends=
+ %destsources=%renderedfiles=%pagecase=();
+ }
open (my $in, "<", "$config{wikistatedir}/index") || return;
while (<$in>) {
$_=possibly_foolish_untaint($_);
my @ret=(
filter => sub {
my $text_ref = shift;
- ${$text_ref} = Encode::decode_utf8(${$text_ref});
+ ${$text_ref} = decode_utf8(${$text_ref});
},
filename => $filename,
loop_context_vars => 1,
if $bestlink eq IkiWiki::bestlink($page, $p);
}
else {
- return IkiWiki::SuccessReason->new("$page links to page matching $link")
+ return IkiWiki::SuccessReason->new("$page links to page $p matching $link")
if match_glob($p, $link, %params);
}
}