X-Git-Url: https://sipb.mit.edu/gitweb.cgi/ikiwiki.git/blobdiff_plain/ecf37caff985ebb12603630564984a78deee182e..1202b4fd7b305b223d64f9e9f24424b72c81ab6d:/IkiWiki.pm diff --git a/IkiWiki.pm b/IkiWiki.pm index 2392c787b..763f24e6c 100644 --- a/IkiWiki.pm +++ b/IkiWiki.pm @@ -16,10 +16,8 @@ our @EXPORT = qw(hook debug error template htmlpage add_depends pagespec_match 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='unknown'; # VERSION_AUTOREPLACE done by Makefile, DNE -my $installdir=''; # INSTALLDIR_AUTOREPLACE done by Makefile, DNE - +our $VERSION = 1.02; # plugin interface version, next is ikiwiki version +our $version="1.45";my $installdir="/usr"; # Optimisation. use Memoize; memoize("abs2rel"); @@ -30,7 +28,7 @@ sub defaultconfig () { #{{{ 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, @@ -38,6 +36,7 @@ sub defaultconfig () { #{{{ wikiname => "wiki", default_pageext => "mdwn", cgi => 0, + post_commit => 0, rcs => '', notify => 0, url => '', @@ -292,7 +291,7 @@ sub writefile ($$$;$$) { #{{{ $writer->(\*OUT, $cleanup); } else { - 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") || @@ -362,20 +361,18 @@ sub pagetitle ($;$) { #{{{ 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; } #}}} @@ -419,23 +416,27 @@ sub displaytime ($) { #{{{ $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 "$linktext" if length $bestlink && $page eq $bestlink; @@ -452,9 +453,14 @@ sub htmllink ($$$;$$$) { #{{{ $bestlink=abs2rel($bestlink, dirname($page)); - if (! $noimageinline && isinlinableimage($bestlink)) { + if (! $opts{noimageinline} && isinlinableimage($bestlink)) { return "\"$linktext\""; } + + if (defined $opts{anchor}) { + $bestlink.="#".$opts{anchor}; + } + return "$linktext"; } #}}} @@ -489,19 +495,26 @@ sub linkify ($$$) { #{{{ 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; } #}}} 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; @@ -553,6 +566,7 @@ sub preprocess ($$$;$) { #{{{ @params, page => $page, destpage => $destpage, + preview => $preprocess_preview, ); $preprocessing{$page}--; return $ret; @@ -589,7 +603,7 @@ sub lockwiki () { #{{{ } 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 @@ -605,6 +619,29 @@ sub unlockwiki () { #{{{ 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 () {