my $historyurl="";
my $svn=1;
my $anonok=0;
+my $rebuild=0;
sub usage { #{{{
die "usage: ikiwiki [options] source templates dest\n";
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
$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>";
sub indexlink () { #{{{
return "<a href=\"$url\">$wikiname</a>";
} #}}}
-
+
sub finalize ($$) { #{{{
my $content=shift;
my $page=shift;
parentlinks => [parentlinks($page)],
content => $content,
backlinks => [backlinks($page)],
+ discussionlink => htmllink($page, "Discussion", 1, 1),
);
return $template->output;
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");
}
} #}}}
$state='body';
}
elsif ($state eq 'body' && /$div/) {
+ my $committype="web";
if (defined $message[0] &&
- $message[0]->{line}=~/^web commit by (\w+)(.*)/) {
- $user="$1 (web)";
+ $message[0]->{line}=~/^web commit by (\w+):?(.*)/) {
+ $user="$1";
$message[0]->{line}=$2;
}
+ else {
+ $committype="svn";
+ }
- push @ret, { rev => $rev, user => $user,
+ push @ret, { rev => $rev,
+ user => htmllink("", $user, 1),
+ committype => $committype,
when => $when, message => [@message],
pages => [@pages] } if @pages;
return @ret if @ret >= $num;
push @params, "--cgiurl=$cgiurl" if $cgiurl;
push @params, "--historyurl=$historyurl" if $historyurl;
push @params, "--anonok" if $anonok;
- my $params=join(" ", @params);
+ my $params=join(" ", map { "\'$_\'" } @params);
my $call='';
foreach my $p ($this, $this, @params) {
$call.=qq{"$p", };
print $q->header, $template->output;
} #}}}
-sub userinfo_get ($$) { #{{
+sub userinfo_get ($$) { #{{{
my $user=shift;
my $field=shift;
return "";
}
return $userdata->{$user}->{$field};
-} #}}
+} #}}}
-sub userinfo_set ($$) { #{{
+sub userinfo_set ($$) { #{{{
my $user=shift;
my $info=shift;
my $ret=Storable::lock_store($userdata, "$srcdir/.ikiwiki/userdb");
umask($oldmask);
return $ret;
-} #}}
+} #}}}
sub cgi_signin ($$) { #{{{
my $q=shift;
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 => {
$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);
$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);
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,
$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)}) {
$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
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");
}
} #}}}
} #}}}
# main {{{
-my $rebuild=0;
my $wrapper=0;
if (grep /^-/, @ARGV) {
eval {use Getopt::Long};
GetOptions(
"wikiname=s" => \$wikiname,
"verbose|v" => \$verbose,
- "rebuild" => \$rebuild,
- "wrapper" => \$wrapper,
+ "rebuild!" => \$rebuild,
+ "wrapper!" => \$wrapper,
"svn!" => \$svn,
"anonok!" => \$anonok,
- "cgi" => \$cgi,
+ "cgi!" => \$cgi,
"url=s" => \$url,
"cgiurl=s" => \$cgiurl,
"historyurl=s" => \$historyurl,