]> sipb.mit.edu Git - ikiwiki.git/blobdiff - IkiWiki.pm
Merge branch 'master' of ssh://git.kitenet.net/srv/git/ikiwiki.info
[ikiwiki.git] / IkiWiki.pm
index 15402211f0af9c5fce989d598d79524721643f71..1091ca8728ee94af5378247a409a9d6e0c45e552 100644 (file)
@@ -38,13 +38,13 @@ sub defaultconfig () { #{{{
                qr/(^|\/)_MTN\//,
                qr/\.dpkg-tmp$/],
        wiki_link_regexp => qr{
-               \[\[                    # beginning of link
+               \[\[(?=[^!])            # beginning of link
                (?:
-                       ([^\]\|\n\s]+)  # 1: link text
+                       ([^\]\|]+)      # 1: link text
                        \|              # followed by '|'
                )?                      # optional
                
-               ([^\s\]#]+)             # 2: page to link to
+               ([^\n\r\]#]+)           # 2: page to link to
                (?:
                        \#              # '#', beginning of anchor
                        ([^\s\]]+)      # 3: anchor text
@@ -62,13 +62,14 @@ sub defaultconfig () { #{{{
        cgi => 0,
        post_commit => 0,
        rcs => '',
-       notify => 0,
        url => '',
        cgiurl => '',
        historyurl => '',
        diffurl => '',
        rss => 0,
        atom => 0,
+       allowrss => 0,
+       allowatom => 0,
        discussion => 1,
        rebuild => 0,
        refresh => 0,
@@ -76,7 +77,6 @@ sub defaultconfig () { #{{{
        w3mmode => 0,
        wrapper => undef,
        wrappermode => undef,
-       svnrepo => undef,
        svnpath => "trunk",
        gitorigin_branch => "origin",
        gitmaster_branch => "master",
@@ -90,7 +90,7 @@ sub defaultconfig () { #{{{
        adminuser => undef,
        adminemail => undef,
        plugin => [qw{mdwn inline htmlscrubber passwordauth openid signinedit
-                     lockedit conditional}],
+                     lockedit conditional recentchanges}],
        libdir => undef,
        timeformat => '%c',
        locale => undef,
@@ -100,6 +100,7 @@ sub defaultconfig () { #{{{
        usedirs => 1,
        numbacklinks => 10,
        account_creation_password => "",
+       prefix_directives => 0,
 } #}}}
 
 sub checkconfig () { #{{{
@@ -146,6 +147,24 @@ sub checkconfig () { #{{{
                umask(possibly_foolish_untaint($config{umask}));
        }
 
+       if (!$config{prefix_directives}) {
+               $config{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,
+       }
+
        run_hooks(checkconfig => sub { shift->() });
 
        return 1;
@@ -262,6 +281,12 @@ sub pagetype ($) { #{{{
        return;
 } #}}}
 
+sub isinternal ($) { #{{{
+       my $page=shift;
+       return exists $pagesources{$page} &&
+               $pagesources{$page} =~ /\._([^.]+)$/;
+} #}}}
+
 sub pagename ($) { #{{{
        my $file=shift;
 
@@ -612,23 +637,9 @@ 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 "<a href=\"$user\">".escapeHTML($display)."</a>";
+       my $oiduser=eval { openiduser($user) };
+       if (defined $oiduser) {
+               return "<a href=\"$user\">$oiduser</a>";
        }
        else {
                return htmllink("", "", escapeHTML(
@@ -707,10 +718,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};
@@ -784,31 +796,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;
 } #}}}
 
@@ -894,7 +933,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>) {
@@ -960,7 +999,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)."=".encode_entities($pagestate{$page}{$id}{$key}, " \t\n");
                                }
                        }
                }
@@ -1280,13 +1319,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);
@@ -1382,19 +1430,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