]> sipb.mit.edu Git - ikiwiki.git/blobdiff - ikiwiki
- Add Discussion links to the button bar, these will automatically create
[ikiwiki.git] / ikiwiki
diff --git a/ikiwiki b/ikiwiki
index 67004e413168f9eb417c5229318fc8e6ed1e4778..b5adfa28c7813aef349703cd6ed6003231147fd1 100755 (executable)
--- a/ikiwiki
+++ b/ikiwiki
@@ -27,6 +27,7 @@ my $cgiurl="";
 my $historyurl="";
 my $svn=1;
 my $anonok=0;
+my $rebuild=0;
 
 sub usage { #{{{
        die "usage: ikiwiki [options] source templates dest\n";
@@ -177,11 +178,12 @@ sub isinlinableimage ($) { #{{{
 sub htmllink { #{{{
        my $page=shift;
        my $link=shift;
-       my $noimagelink=shift;
+       my $noimageinline=shift; # don't turn links into inline html images
+       my $createsubpage=shift; # force creation of a subpage if page DNE
 
        my $bestlink=bestlink($page, $link);
 
-       return $link if $page eq $bestlink;
+       return $link if length $bestlink && $page eq $bestlink;
        
        # TODO BUG: %renderedfiles may not have it, if the linked to page
        # was also added and isn't yet rendered! Note that this bug is
@@ -191,12 +193,17 @@ sub htmllink { #{{{
                $bestlink=htmlpage($bestlink);
        }
        if (! grep { $_ eq $bestlink } values %renderedfiles) {
-               return "<a href=\"$cgiurl?do=create&page=$link&from=$page\">?</a>$link"
+               if (! $createsubpage) {
+                       return "<a href=\"$cgiurl?do=create&page=$link&from=$page\">?</a>$link"
+               }
+               else {
+                       return "<a href=\"$cgiurl?do=create&page=$page/$link\">?</a>$link"
+               }
        }
        
        $bestlink=File::Spec->abs2rel($bestlink, dirname($page));
        
-       if (! $noimagelink && isinlinableimage($bestlink)) {
+       if (! $noimageinline && isinlinableimage($bestlink)) {
                return "<img src=\"$bestlink\">";
        }
        return "<a href=\"$bestlink\">$link</a>";
@@ -271,7 +278,7 @@ sub parentlinks ($) { #{{{
 sub indexlink () { #{{{
        return "<a href=\"$url\">$wikiname</a>";
 } #}}}
-       
+
 sub finalize ($$) { #{{{
        my $content=shift;
        my $page=shift;
@@ -301,6 +308,7 @@ sub finalize ($$) { #{{{
                parentlinks => [parentlinks($page)],
                content => $content,
                backlinks => [backlinks($page)],
+               discussionlink => htmllink($page, "Discussion", 1, 1),
        );
        
        return $template->output;
@@ -312,8 +320,11 @@ sub check_overwrite ($$) { #{{{
        my $dest=shift;
        my $src=shift;
        
-       if (! exists $renderedfiles{$src} && -e $dest) {
-               error("$dest exists and was not rendered from $src before, not overwriting");
+       if (! exists $renderedfiles{$src} && -e $dest && ! $rebuild) {
+               error("$dest exists and was rendered from ".
+                       join(" ",(grep { $renderedfiles{$_} eq $dest } keys
+                               %renderedfiles)).
+                       ", not from $src before not overwriting");
        }
 } #}}}
                
@@ -446,7 +457,19 @@ sub rcs_recentchanges ($) { #{{{
                                $state='body';
                        }
                        elsif ($state eq 'body' && /$div/) {
-                               push @ret, { rev => $rev, user => $user,
+                               my $committype="web";
+                               if (defined $message[0] &&
+                                   $message[0]->{line}=~/^web commit by (\w+):?(.*)/) {
+                                       $user="$1";
+                                       $message[0]->{line}=$2;
+                               }
+                               else {
+                                       $committype="svn";
+                               }
+                               
+                               push @ret, { rev => $rev,
+                                       user => htmllink("", $user, 1),
+                                       committype => $committype,
                                        when => $when, message => [@message],
                                        pages => [@pages] } if @pages;
                                return @ret if @ret >= $num;
@@ -709,7 +732,7 @@ sub cgi_recentchanges ($) { #{{{
        print $q->header, $template->output;
 } #}}}
 
-sub userinfo_get ($$) { #{{
+sub userinfo_get ($$) { #{{{
        my $user=shift;
        my $field=shift;
 
@@ -720,9 +743,9 @@ sub userinfo_get ($$) { #{{
                return "";
        }
        return $userdata->{$user}->{$field};
-} #}}
+} #}}}
 
-sub userinfo_set ($$) { #{{
+sub userinfo_set ($$) { #{{{
        my $user=shift;
        my $info=shift;
        
@@ -736,7 +759,7 @@ sub userinfo_set ($$) { #{{
        my $ret=Storable::lock_store($userdata, "$srcdir/.ikiwiki/userdb");
        umask($oldmask);
        return $ret;
-} #}}
+} #}}}
 
 sub cgi_signin ($$) { #{{{
        my $q=shift;
@@ -745,7 +768,7 @@ sub cgi_signin ($$) { #{{{
        eval q{use CGI::FormBuilder};
        my $form = CGI::FormBuilder->new(
                title => "$wikiname signin",
-               fields => [qw(do page name password confirm_password email)],
+               fields => [qw(do page from name password confirm_password email)],
                header => 1,
                method => 'POST',
                validate => {
@@ -765,6 +788,7 @@ sub cgi_signin ($$) { #{{{
        $form->field(name => "name", required => 0);
        $form->field(name => "do", type => "hidden");
        $form->field(name => "page", type => "hidden");
+       $form->field(name => "from", type => "hidden");
        $form->field(name => "password", type => "password", required => 0);
        $form->field(name => "confirm_password", type => "password", required => 0);
        $form->field(name => "email", required => 0);
@@ -838,7 +862,8 @@ sub cgi_signin ($$) { #{{{
                            $form->field("do") ne 'signin') {
                                print $q->redirect(
                                        "$cgiurl?do=".$form->field("do").
-                                       "&page=".$form->field("page"));
+                                       "&page=".$form->field("page").
+                                       "&from=".$form->field("from"));;
                        }
                        else {
                                print $q->redirect($url);
@@ -905,8 +930,10 @@ sub cgi_editpage ($$) { #{{{
                fields => [qw(do from page content comments)],
                header => 1,
                method => 'POST',
-               validate => {},
-               required => [qw{}],
+               validate => {
+                       content => '/.+/',
+               },
+               required => [qw{content}],
                javascript => 0,
                params => $q,
                action => $q->request_uri,
@@ -928,6 +955,10 @@ sub cgi_editpage ($$) { #{{{
        $form->field(name => "content", type => "textarea", rows => 20,
                cols => 80);
        
+       if ($form->submitted eq "Cancel") {
+               print $q->redirect("$url/".htmlpage($page));
+               return;
+       }
        if (! $form->submitted || ! $form->validate) {
                if ($form->field("do") eq "create") {
                        if (exists $pagesources{lc($page)}) {
@@ -975,7 +1006,7 @@ sub cgi_editpage ($$) { #{{{
                
                $form->tmpl_param("can_commit", $svn);
                $form->tmpl_param("indexlink", indexlink());
-               print $form->render(submit => ["Save Page"]);
+               print $form->render(submit => ["Save Page", "Cancel"]);
        }
        else {
                # save page
@@ -1015,7 +1046,9 @@ sub cgi_editpage ($$) { #{{{
                        refresh();
                }
                
-               print $q->redirect("$url/".htmlpage($page));
+               # The trailing question mark tries to avoid broken
+               # caches and get the most recent version of the page.
+               print $q->redirect("$url/".htmlpage($page)."?updated");
        }
 } #}}}
 
@@ -1065,7 +1098,6 @@ sub cgi () { #{{{
 } #}}}
 
 # main {{{
-my $rebuild=0;
 my $wrapper=0;
 if (grep /^-/, @ARGV) {
        eval {use Getopt::Long};