X-Git-Url: https://scripts.mit.edu/gitweb/www/ikiwiki.git/blobdiff_plain/d7fdd04b5a113b6dded40cb79b670b16570c11b3..52d9f8e9f38f03efd0b1662f3f2d20ce115ed099:/IkiWiki.pm?ds=sidebyside
diff --git a/IkiWiki.pm b/IkiWiki.pm
index 2c3ddac23..668de7e93 100644
--- a/IkiWiki.pm
+++ b/IkiWiki.pm
@@ -37,21 +37,6 @@ sub defaultconfig () { #{{{
qr/(^|\/).svn\//, qr/.arch-ids\//, qr/{arch}\//,
qr/(^|\/)_MTN\//,
qr/\.dpkg-tmp$/],
- wiki_link_regexp => qr{
- \[\[ # beginning of link
- (?:
- ([^\]\|\n\s]+) # 1: link text
- \| # followed by '|'
- )? # optional
-
- ([^\s\]#]+) # 2: page to link to
- (?:
- \# # '#', beginning of anchor
- ([^\s\]]+) # 3: anchor text
- )? # optional
-
- \]\] # end of link
- }x,
wiki_file_regexp => qr/(^[-[:alnum:]_.:\/+]+$)/,
web_commit_regexp => qr/^web commit (by (.*?(?=: |$))|from (\d+\.\d+\.\d+\.\d+)):?(.*)/,
verbose => 0,
@@ -68,6 +53,8 @@ sub defaultconfig () { #{{{
diffurl => '',
rss => 0,
atom => 0,
+ allowrss => 0,
+ allowatom => 0,
discussion => 1,
rebuild => 0,
refresh => 0,
@@ -87,8 +74,8 @@ sub defaultconfig () { #{{{
setup => undef,
adminuser => undef,
adminemail => undef,
- plugin => [qw{mdwn inline htmlscrubber passwordauth openid signinedit
- lockedit conditional recentchanges}],
+ plugin => [qw{mdwn link inline htmlscrubber passwordauth openid
+ signinedit lockedit conditional recentchanges}],
libdir => undef,
timeformat => '%c',
locale => undef,
@@ -98,6 +85,7 @@ sub defaultconfig () { #{{{
usedirs => 1,
numbacklinks => 10,
account_creation_password => "",
+ prefix_directives => 0,
} #}}}
sub checkconfig () { #{{{
@@ -260,6 +248,12 @@ sub pagetype ($) { #{{{
return;
} #}}}
+sub isinternal ($) { #{{{
+ my $page=shift;
+ return exists $pagesources{$page} &&
+ $pagesources{$page} =~ /\._([^.]+)$/;
+} #}}}
+
sub pagename ($) { #{{{
my $file=shift;
@@ -610,26 +604,14 @@ sub htmllink ($$$;@) { #{{{
sub userlink ($) { #{{{
my $user=shift;
- eval q{use CGI 'escapeHTML'};
- error($@) if $@;
- if ($user =~ m!^https?://! &&
- eval q{use Net::OpenID::VerifiedIdentity; 1} && !$@) {
- # Munge user-urls, as used by eg, OpenID.
- my $oid=Net::OpenID::VerifiedIdentity->new(identity => $user);
- my $display=$oid->display;
- # Convert "user.somehost.com" to "user [somehost.com]".
- if ($display !~ /\[/) {
- $display=~s/^(.*?)\.([^.]+\.[a-z]+)$/$1 [$2]/;
- }
- # Convert "http://somehost.com/user" to "user [somehost.com]".
- if ($display !~ /\[/) {
- $display=~s/^https?:\/\/(.+)\/([^\/]+)$/$2 [$1]/;
- }
- $display=~s!^https?://!!; # make sure this is removed
- return "".escapeHTML($display)."";
+ my $oiduser=eval { openiduser($user) };
+ if (defined $oiduser) {
+ return "$oiduser";
}
else {
- return $user;
+ return htmllink("", "", escapeHTML(
+ length $config{userdir} ? $config{userdir}."/".$user : $user
+ ), noimageinline => 1);
}
} #}}}
@@ -669,21 +651,17 @@ sub htmlize ($$$) { #{{{
} #}}}
sub linkify ($$$) { #{{{
- my $lpage=shift; # the page containing the links
- my $page=shift; # the page the link will end up on (different for inline)
+ my $page=shift;
+ my $destpage=shift;
my $content=shift;
- $content =~ s{(\\?)$config{wiki_link_regexp}}{
- defined $2
- ? ( $1
- ? "[[$2|$3".($4 ? "#$4" : "")."]]"
- : htmllink($lpage, $page, linkpage($3),
- anchor => $4, linktext => pagetitle($2)))
- : ( $1
- ? "[[$3".($4 ? "#$4" : "")."]]"
- : htmllink($lpage, $page, linkpage($3),
- anchor => $4))
- }eg;
+ run_hooks(linkify => sub {
+ $content=shift->(
+ page => $page,
+ destpage => $destpage,
+ content => $content,
+ );
+ });
return $content;
} #}}}
@@ -703,10 +681,11 @@ sub preprocess ($$$;$$) { #{{{
my $handle=sub {
my $escape=shift;
+ my $prefix=shift;
my $command=shift;
my $params=shift;
if (length $escape) {
- return "[[$command $params]]";
+ return "[[$prefix$command $params]]";
}
elsif (exists $hooks{preprocess}{$command}) {
return "" if $scan && ! $hooks{preprocess}{$command}{scan};
@@ -780,31 +759,58 @@ sub preprocess ($$$;$$) { #{{{
return $ret;
}
else {
- return "[[$command $params]]";
+ return "[[$prefix$command $params]]";
}
};
- $content =~ s{
- (\\?) # 1: escape?
- \[\[ # directive open
- ([-\w]+) # 2: command
- \s+
- ( # 3: the parameters..
- (?:
- (?:[-\w]+=)? # named parameter key?
+ my $regex;
+ if ($config{prefix_directives}) {
+ $regex = qr{
+ (\\?) # 1: escape?
+ \[\[(!) # directive open; 2: prefix
+ ([-\w]+) # 3: command
+ ( # 4: the parameters..
+ \s+ # Must have space if parameters present
+ (?:
+ (?:[-\w]+=)? # named parameter key?
+ (?:
+ """.*?""" # triple-quoted value
+ |
+ "[^"]+" # single-quoted value
+ |
+ [^\s\]]+ # unquoted value
+ )
+ \s* # whitespace or end
+ # of directive
+ )
+ *)? # 0 or more parameters
+ \]\] # directive closed
+ }sx;
+ } else {
+ $regex = qr{
+ (\\?) # 1: escape?
+ \[\[(!?) # directive open; 2: optional prefix
+ ([-\w]+) # 3: command
+ \s+
+ ( # 4: the parameters..
(?:
- """.*?""" # triple-quoted value
- |
- "[^"]+" # single-quoted value
- |
- [^\s\]]+ # unquoted value
+ (?:[-\w]+=)? # named parameter key?
+ (?:
+ """.*?""" # triple-quoted value
+ |
+ "[^"]+" # single-quoted value
+ |
+ [^\s\]]+ # unquoted value
+ )
+ \s* # whitespace or end
+ # of directive
)
- \s* # whitespace or end
- # of directive
- )
- *) # 0 or more parameters
- \]\] # directive closed
- }{$handle->($1, $2, $3)}sexg;
+ *) # 0 or more parameters
+ \]\] # directive closed
+ }sx;
+ }
+
+ $content =~ s{$regex}{$handle->($1, $2, $3, $4)}eg;
return $content;
} #}}}
@@ -890,7 +896,7 @@ sub loadindex () { #{{{
%oldrenderedfiles=%pagectime=();
if (! $config{rebuild}) {
%pagesources=%pagemtime=%oldlinks=%links=%depends=
- %destsources=%renderedfiles=%pagecase=();
+ %destsources=%renderedfiles=%pagecase=%pagestate=();
}
open (my $in, "<", "$config{wikistatedir}/index") || return;
while (<$in>) {
@@ -956,7 +962,7 @@ sub saveindex () { #{{{
if (exists $pagestate{$page}) {
foreach my $id (@hookids) {
foreach my $key (keys %{$pagestate{$page}{$id}}) {
- $line.=' '.$id.'_'.encode_entities($key)."=".encode_entities($pagestate{$page}{$id}{$key});
+ $line.=' '.$id.'_'.encode_entities($key, " \t\n")."=".encode_entities($pagestate{$page}{$id}{$key}, " \t\n");
}
}
}
@@ -1276,13 +1282,22 @@ sub match_glob ($$;@) { #{{{
$glob=~s/\\\?/./g;
if ($page=~/^$glob$/i) {
- return IkiWiki::SuccessReason->new("$glob matches $page");
+ if (! IkiWiki::isinternal($page) || $params{internal}) {
+ return IkiWiki::SuccessReason->new("$glob matches $page");
+ }
+ else {
+ return IkiWiki::FailReason->new("$glob matches $page, but the page is an internal page");
+ }
}
else {
return IkiWiki::FailReason->new("$glob does not match $page");
}
} #}}}
+sub match_internal ($$;@) { #{{{
+ return match_glob($_[0], $_[1], @_, internal => 1)
+} #}}}
+
sub match_link ($$;@) { #{{{
my $page=shift;
my $link=lc(shift);
@@ -1378,19 +1393,4 @@ sub match_creation_year ($$;@) { #{{{
}
} #}}}
-sub match_user ($$;@) { #{{{
- shift;
- my $user=shift;
- my %params=@_;
-
- return IkiWiki::FailReason->new('cannot match user')
- unless exists $params{user};
- if ($user eq $params{user}) {
- return IkiWiki::SuccessReason->new("user is $user")
- }
- else {
- return IkiWiki::FailReason->new("user is not $user");
- }
-} #}}}
-
1