summaryrefslogtreecommitdiff
path: root/IkiWiki
diff options
context:
space:
mode:
Diffstat (limited to 'IkiWiki')
-rw-r--r--IkiWiki/Plugin/aggregate.pm18
-rw-r--r--IkiWiki/Plugin/comments.pm18
-rw-r--r--IkiWiki/Plugin/git.pm2
-rw-r--r--IkiWiki/Plugin/img.pm7
-rw-r--r--IkiWiki/Plugin/openid.pm4
-rw-r--r--IkiWiki/Plugin/po.pm61
-rw-r--r--IkiWiki/Setup.pm27
7 files changed, 109 insertions, 28 deletions
diff --git a/IkiWiki/Plugin/aggregate.pm b/IkiWiki/Plugin/aggregate.pm
index 5a9eb433d..7789c4c2a 100644
--- a/IkiWiki/Plugin/aggregate.pm
+++ b/IkiWiki/Plugin/aggregate.pm
@@ -298,7 +298,7 @@ sub loadstate () {
return if $state_loaded;
$state_loaded=1;
if (-e "$config{wikistatedir}/aggregate") {
- open(IN, "$config{wikistatedir}/aggregate") ||
+ open(IN, "<", "$config{wikistatedir}/aggregate") ||
die "$config{wikistatedir}/aggregate: $!";
while (<IN>) {
$_=IkiWiki::possibly_foolish_untaint($_);
@@ -335,7 +335,7 @@ sub savestate () {
garbage_collect();
my $newfile="$config{wikistatedir}/aggregate.new";
my $cleanup = sub { unlink($newfile) };
- open (OUT, ">$newfile") || error("open $newfile: $!", $cleanup);
+ open (OUT, ">", $newfile) || error("open $newfile: $!", $cleanup);
foreach my $data (values %feeds, values %guids) {
my @line;
foreach my $field (keys %$data) {
@@ -356,6 +356,20 @@ sub savestate () {
close OUT || error("save $newfile: $!", $cleanup);
rename($newfile, "$config{wikistatedir}/aggregate") ||
error("rename $newfile: $!", $cleanup);
+
+ my $timestamp=undef;
+ foreach my $feed (keys %feeds) {
+ my $t=$feeds{$feed}->{lastupdate}+$feeds{$feed}->{updateinterval};
+ if (! defined $timestamp || $timestamp > $t) {
+ $timestamp=$t;
+ }
+ }
+ $newfile=~s/\.new$/time/;
+ open (OUT, ">", $newfile) || error("open $newfile: $!", $cleanup);
+ if (defined $timestamp) {
+ print OUT $timestamp."\n";
+ }
+ close OUT || error("save $newfile: $!", $cleanup);
}
sub garbage_collect () {
diff --git a/IkiWiki/Plugin/comments.pm b/IkiWiki/Plugin/comments.pm
index 64eb7fb09..851f4862e 100644
--- a/IkiWiki/Plugin/comments.pm
+++ b/IkiWiki/Plugin/comments.pm
@@ -22,6 +22,7 @@ sub import {
hook(type => "checkconfig", id => 'comments', call => \&checkconfig);
hook(type => "getsetup", id => 'comments', call => \&getsetup);
hook(type => "preprocess", id => 'comment', call => \&preprocess);
+ hook(type => "preprocess", id => 'commentmoderation', call => \&preprocess_moderation);
# here for backwards compatability with old comments
hook(type => "preprocess", id => '_comment', call => \&preprocess);
hook(type => "sessioncgi", id => 'comment', call => \&sessioncgi);
@@ -249,6 +250,22 @@ sub preprocess {
return $content;
}
+sub preprocess_moderation {
+ my %params = @_;
+
+ $params{desc}=gettext("Comment Moderation")
+ unless defined $params{desc};
+
+ if (length $config{cgiurl}) {
+ return '<a href="'.
+ IkiWiki::cgiurl(do => 'commentmoderation').
+ '">'.$params{desc}.'</a>';
+ }
+ else {
+ return $params{desc};
+ }
+}
+
sub sessioncgi ($$) {
my $cgi=shift;
my $session=shift;
@@ -567,6 +584,7 @@ sub commentmoderation ($$) {
my $added=0;
foreach my $id (keys %vars) {
if ($id =~ /(.*)\._comment(?:_pending)?$/) {
+ $id=decode_utf8($id);
my $action=$cgi->param($id);
next if $action eq 'Defer' && ! $rejectalldefer;
diff --git a/IkiWiki/Plugin/git.pm b/IkiWiki/Plugin/git.pm
index 0f92476c9..cb3437e18 100644
--- a/IkiWiki/Plugin/git.pm
+++ b/IkiWiki/Plugin/git.pm
@@ -517,6 +517,8 @@ sub rcs_commit_staged (@) {
}
if (defined $params{session}->param("nickname")) {
$u=encode_utf8($params{session}->param("nickname"));
+ $u=~s/\s+/_/g;
+ $u=~s/[^-_0-9[:alnum:]]+//g;
}
if (defined $u) {
$ENV{GIT_AUTHOR_EMAIL}="$u\@web";
diff --git a/IkiWiki/Plugin/img.pm b/IkiWiki/Plugin/img.pm
index eb1b68124..2375ead89 100644
--- a/IkiWiki/Plugin/img.pm
+++ b/IkiWiki/Plugin/img.pm
@@ -156,6 +156,13 @@ sub preprocess (@) {
$imgurl="$config{url}/$imglink";
}
+ if (exists $params{class}) {
+ $params{class}.=" img";
+ }
+ else {
+ $params{class}="img";
+ }
+
my $attrs='';
foreach my $attr (qw{alt title class id hspace vspace}) {
if (exists $params{$attr}) {
diff --git a/IkiWiki/Plugin/openid.pm b/IkiWiki/Plugin/openid.pm
index d393afd23..fae9fb77f 100644
--- a/IkiWiki/Plugin/openid.pm
+++ b/IkiWiki/Plugin/openid.pm
@@ -211,8 +211,8 @@ sub auth ($$) {
}
}
if (defined $nickname) {
- $nickname=~s/\s+/_/g;
- $session->param(nickname => $nickname);
+ $session->param(nickname =>
+ Encode::decode_utf8($nickname));
}
}
else {
diff --git a/IkiWiki/Plugin/po.pm b/IkiWiki/Plugin/po.pm
index 0b2251668..4e6eff94f 100644
--- a/IkiWiki/Plugin/po.pm
+++ b/IkiWiki/Plugin/po.pm
@@ -848,18 +848,18 @@ sub refreshpot ($) {
my $masterfile=shift;
my $potfile=potfile($masterfile);
- my %options = ("markdown" => (pagetype($masterfile) eq 'mdwn') ? 1 : 0);
- my $doc=Locale::Po4a::Chooser::new('text',%options);
+ my $doc=Locale::Po4a::Chooser::new(po4a_type($masterfile),
+ po4a_options($masterfile));
$doc->{TT}{utf_mode} = 1;
- $doc->{TT}{file_in_charset} = 'utf-8';
- $doc->{TT}{file_out_charset} = 'utf-8';
+ $doc->{TT}{file_in_charset} = 'UTF-8';
+ $doc->{TT}{file_out_charset} = 'UTF-8';
$doc->read($masterfile);
# let's cheat a bit to force porefs option to be passed to
# Locale::Po4a::Po; this is undocument use of internal
# Locale::Po4a::TransTractor's data, compulsory since this module
# prevents us from using the porefs option.
$doc->{TT}{po_out}=Locale::Po4a::Po->new({ 'porefs' => 'none' });
- $doc->{TT}{po_out}->set_charset('utf-8');
+ $doc->{TT}{po_out}->set_charset('UTF-8');
# do the actual work
$doc->parse;
IkiWiki::prep_writefile(basename($potfile),dirname($potfile));
@@ -940,15 +940,13 @@ sub percenttranslated ($) {
return gettext("N/A") unless istranslation($page);
my $file=srcfile($pagesources{$page});
my $masterfile = srcfile($pagesources{masterpage($page)});
- my %options = (
- "markdown" => (pagetype($masterfile) eq 'mdwn') ? 1 : 0,
- );
- my $doc=Locale::Po4a::Chooser::new('text',%options);
+ my $doc=Locale::Po4a::Chooser::new(po4a_type($masterfile),
+ po4a_options($masterfile));
$doc->process(
'po_in_name' => [ $file ],
'file_in_name' => [ $masterfile ],
- 'file_in_charset' => 'utf-8',
- 'file_out_charset' => 'utf-8',
+ 'file_in_charset' => 'UTF-8',
+ 'file_out_charset' => 'UTF-8',
) or error("po(percenttranslated) ".
sprintf(gettext("failed to translate %s"), $page));
my ($percent,$hit,$queries) = $doc->stats();
@@ -1094,15 +1092,13 @@ sub po_to_markup ($$) {
or return $fail->(sprintf(gettext("failed to write %s"), $infile));
my $masterfile = srcfile($pagesources{masterpage($page)});
- my %options = (
- "markdown" => (pagetype($masterfile) eq 'mdwn') ? 1 : 0,
- );
- my $doc=Locale::Po4a::Chooser::new('text',%options);
+ my $doc=Locale::Po4a::Chooser::new(po4a_type($masterfile),
+ po4a_options($masterfile));
$doc->process(
'po_in_name' => [ $infile ],
'file_in_name' => [ $masterfile ],
- 'file_in_charset' => 'utf-8',
- 'file_out_charset' => 'utf-8',
+ 'file_in_charset' => 'UTF-8',
+ 'file_out_charset' => 'UTF-8',
) or return $fail->(gettext("failed to translate"));
$doc->write($outfile)
or return $fail->(sprintf(gettext("failed to write %s"), $outfile));
@@ -1160,6 +1156,37 @@ sub isvalidpo ($) {
"to previous page to continue edit"));
}
+sub po4a_type ($) {
+ my $file = shift;
+
+ my $pagetype = pagetype($file);
+ if ($pagetype eq 'html') {
+ return 'xhtml';
+ }
+ return 'text';
+}
+
+sub po4a_options($) {
+ my $file = shift;
+
+ my %options;
+ my $pagetype = pagetype($file);
+
+ if ($pagetype eq 'html') {
+ # how to disable options is not consistent across po4a modules
+ $options{includessi} = '';
+ $options{includeexternal} = 0;
+ }
+ elsif ($pagetype eq 'mdwn') {
+ $options{markdown} = 1;
+ }
+ else {
+ $options{markdown} = 0;
+ }
+
+ return %options;
+}
+
# ,----
# | PageSpecs
# `----
diff --git a/IkiWiki/Setup.pm b/IkiWiki/Setup.pm
index 2b0259e2a..7af744f6a 100644
--- a/IkiWiki/Setup.pm
+++ b/IkiWiki/Setup.pm
@@ -50,10 +50,8 @@ sub load ($;$) {
sub dump ($) {
my $file=IkiWiki::possibly_foolish_untaint(shift);
-
- eval qq{require IkiWiki::Setup::$config{setuptype}};
- error $@ if $@;
- my @dump="IkiWiki::Setup::$config{setuptype}"->gendump(
+
+ my @header=(
"Setup file for ikiwiki.",
"",
"Passing this to ikiwiki --setup will make ikiwiki generate",
@@ -62,9 +60,24 @@ sub dump ($) {
"Remember to re-run ikiwiki --setup any time you edit this file.",
);
- open (OUT, ">", $file) || die "$file: $!";
- print OUT "$_\n" foreach @dump;
- close OUT;
+ # Fork because dumping setup requires loading all plugins.
+ my $pid=fork();
+ if ($pid == 0) {
+ eval qq{require IkiWiki::Setup::$config{setuptype}};
+ error $@ if $@;
+ my @dump="IkiWiki::Setup::$config{setuptype}"->gendump(@header);
+
+ open (OUT, ">", $file) || die "$file: $!";
+ print OUT "$_\n" foreach @dump;
+ close OUT;
+
+ exit 0;
+ }
+ else {
+ waitpid $pid, 0;
+ exit($? >> 8) if $? >> 8;
+ exit(1) if $?;
+ }
}
sub merge ($) {