bestlink htmllink readfile writefile pagetype srcfile pagename
displaytime will_render gettext
%config %links %renderedfiles %pagesources);
-our $VERSION = 1.01; # plugin interface version, next is ikiwiki version
+our $VERSION = 1.02; # plugin interface version, next is ikiwiki version
our $version='unknown'; # VERSION_AUTOREPLACE done by Makefile, DNE
my $installdir=''; # INSTALLDIR_AUTOREPLACE done by Makefile, DNE
wiki_file_prune_regexps => [qr/\.\./, qr/^\./, qr/\/\./,
qr/\.x?html?$/, qr/\.ikiwiki-new$/,
qr/(^|\/).svn\//, qr/.arch-ids\//, qr/{arch}\//],
- wiki_link_regexp => qr/\[\[(?:([^\]\|]+)\|)?([^\s\]]+)\]\]/,
+ wiki_link_regexp => qr/\[\[(?:([^\]\|]+)\|)?([^\s\]#]+)(?:#([^\s\]]+))?\]\]/,
wiki_file_regexp => qr/(^[-[:alnum:]_.:\/+]+$)/,
web_commit_regexp => qr/^web commit (by (.*?(?=: |$))|from (\d+\.\d+\.\d+\.\d+)):?(.*)/,
verbose => 0,
wikiname => "wiki",
default_pageext => "mdwn",
cgi => 0,
+ post_commit => 0,
rcs => '',
notify => 0,
url => '',
$writer->(\*OUT, $cleanup);
}
else {
- print OUT $content || error("failed writing to $newfile: $!", $cleanup);
+ if (length $content) {
+ print OUT $content || error("failed writing to $newfile: $!", $cleanup);
+ }
}
close OUT || error("failed saving $newfile: $!", $cleanup);
rename($newfile, "$destdir/$file") ||
$config{timeformat}, localtime($time)));
} #}}}
-sub htmllink ($$$;$$$) { #{{{
+sub htmllink ($$$;@) { #{{{
my $lpage=shift; # the page doing the linking
my $page=shift; # the page that will contain the link (different for inline)
my $link=shift;
- my $noimageinline=shift; # don't turn links into inline html images
- my $forcesubpage=shift; # force a link to a subpage
- my $linktext=shift; # set to force the link text to something
+ my %opts=@_;
my $bestlink;
- if (! $forcesubpage) {
+ if (! $opts{forcesubpage}) {
$bestlink=bestlink($lpage, $link);
}
else {
$bestlink="$lpage/".lc($link);
}
- $linktext=pagetitle(basename($link)) unless defined $linktext;
+ my $linktext;
+ if (defined $opts{linktext}) {
+ $linktext=$opts{linktext};
+ }
+ else {
+ $linktext=pagetitle(basename($link));
+ }
return "<span class=\"selflink\">$linktext</span>"
if length $bestlink && $page eq $bestlink;
$bestlink=abs2rel($bestlink, dirname($page));
- if (! $noimageinline && isinlinableimage($bestlink)) {
+ if (! $opts{noimageinline} && isinlinableimage($bestlink)) {
return "<img src=\"$bestlink\" alt=\"$linktext\" />";
}
+
+ if (defined $opts{anchor}) {
+ $bestlink.="#".$opts{anchor};
+ }
+
return "<a href=\"$bestlink\">$linktext</a>";
} #}}}
my $content=shift;
$content =~ s{(\\?)$config{wiki_link_regexp}}{
- $2 ? ( $1 ? "[[$2|$3]]" : htmllink($lpage, $page, titlepage($3), 0, 0, pagetitle($2)))
- : ( $1 ? "[[$3]]" : htmllink($lpage, $page, titlepage($3)))
+ defined $2
+ ? ( $1 ? "[[$2|$3]]" : htmllink($lpage, $page, titlepage($3), anchor => $4, linktext => pagetitle($2)))
+ : ( $1 ? "[[$3]]" : htmllink($lpage, $page, titlepage($3), anchor => $4))
}eg;
return $content;
}
open(WIKILOCK, ">$config{wikistatedir}/lockfile") ||
error ("cannot write to $config{wikistatedir}/lockfile: $!");
- if (! flock(WIKILOCK, 2 | 4)) {
+ if (! flock(WIKILOCK, 2 | 4)) { # LOCK_EX | LOCK_NB
debug("wiki seems to be locked, waiting for lock");
my $wait=600; # arbitrary, but don't hang forever to
# prevent process pileup
close WIKILOCK;
} #}}}
+sub commit_hook_enabled () { #{{{
+ open(COMMITLOCK, "+>$config{wikistatedir}/commitlock") ||
+ error ("cannot write to $config{wikistatedir}/commitlock: $!");
+ if (! flock(COMMITLOCK, 1 | 4)) { # LOCK_SH | LOCK_NB to test
+ close COMMITLOCK;
+ return 0;
+ }
+ close COMMITLOCK;
+ return 1;
+} #}}}
+
+sub disable_commit_hook () { #{{{
+ open(COMMITLOCK, ">$config{wikistatedir}/commitlock") ||
+ error ("cannot write to $config{wikistatedir}/commitlock: $!");
+ if (! flock(COMMITLOCK, 2)) { # LOCK_EX
+ error("failed to get commit lock");
+ }
+} #}}}
+
+sub enable_commit_hook () { #{{{
+ close COMMITLOCK;
+} #}}}
+
sub loadindex () { #{{{
open (IN, "$config{wikistatedir}/index") || return;
while (<IN>) {