use strict;
use Encode;
use HTML::Entities;
+use URI::Escape q{uri_escape_utf8};
use open qw{:utf8 :std};
use vars qw{%config %links %oldlinks %oldpagemtime %pagectime %pagecase
displaytime will_render gettext
%config %links %renderedfiles %pagesources);
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
-
+our $version="1.45";my $installdir="/usr";
# Optimisation.
use Memoize;
memoize("abs2rel");
wikiname => "wiki",
default_pageext => "mdwn",
cgi => 0,
+ post_commit => 0,
rcs => '',
notify => 0,
url => '',
$writer->(\*OUT, $cleanup);
}
else {
- if (length $content) {
- print OUT $content || error("failed writing to $newfile: $!", $cleanup);
- }
+ print OUT $content or error("failed writing to $newfile: $!", $cleanup);
}
close OUT || error("failed saving $newfile: $!", $cleanup);
rename($newfile, "$destdir/$file") ||
my $unescaped=shift;
if ($unescaped) {
- $page=~s/__(\d+)__/chr($1)/eg;
+ $page=~s/(__(\d+)__|_)/$1 eq '_' ? ' ' : chr($2)/eg;
}
else {
- $page=~s/__(\d+)__/&#$1;/g;
+ $page=~s/(__(\d+)__|_)/$1 eq '_' ? ' ' : "&#$2;"/eg;
}
- $page=~y/_/ /;
return $page;
} #}}}
sub titlepage ($) { #{{{
my $title=shift;
- $title=~y/ /_/;
- $title=~s/([^-[:alnum:]_:+\/.])/"__".ord($1)."__"/eg;
+ $title=~s/([^-[:alnum:]:+\/.])/$1 eq ' ' ? '_' : "__".ord($1)."__"/eg;
return $title;
} #}}}
+sub linkpage ($) { #{{{
+ my $link=shift;
+ $link=~s/([^-[:alnum:]:+\/._])/$1 eq ' ' ? '_' : "__".ord($1)."__"/eg;
+ return $link;
+} #}}}
+
sub cgiurl (@) { #{{{
my %params=@_;
- return $config{cgiurl}."?".join("&", map "$_=$params{$_}", keys %params);
+ return $config{cgiurl}."?".
+ join("&", map $_."=".uri_escape_utf8($params{$_}), keys %params);
} #}}}
sub baseurl (;$) { #{{{
if (! grep { $_ eq $bestlink } map { @{$_} } values %renderedfiles) {
return $linktext unless length $config{cgiurl};
return "<span><a href=\"".
- cgiurl(do => "create", page => lc($link), from => $page).
+ cgiurl(
+ do => "create",
+ page => pagetitle(lc($link), 1),
+ from => $lpage
+ ).
"\">?</a>$linktext</span>"
}
$content =~ s{(\\?)$config{wiki_link_regexp}}{
defined $2
- ? ( $1 ? "[[$2|$3]]" : htmllink($lpage, $page, titlepage($3), anchor => $4, linktext => pagetitle($2)))
- : ( $1 ? "[[$3]]" : htmllink($lpage, $page, titlepage($3), anchor => $4))
+ ? ( $1 ? "[[$2|$3]]" : htmllink($lpage, $page, linkpage($3), anchor => $4, linktext => pagetitle($2)))
+ : ( $1 ? "[[$3]]" : htmllink($lpage, $page, linkpage($3), anchor => $4))
}eg;
return $content;
} #}}}
my %preprocessing;
-sub preprocess ($$$;$) { #{{{
+our $preprocess_preview=0;
+sub preprocess ($$$;$$) { #{{{
my $page=shift; # the page the data comes from
my $destpage=shift; # the page the data will appear in (different for inline)
my $content=shift;
my $scan=shift;
+ my $preview=shift;
+
+ # Using local because it needs to be set within any nested calls
+ # of this function.
+ local $preprocess_preview=$preview if defined $preview;
my $handle=sub {
my $escape=shift;
@params,
page => $page,
destpage => $destpage,
+ preview => $preprocess_preview,
);
$preprocessing{$page}--;
return $ret;
}
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>) {