summaryrefslogtreecommitdiff
path: root/IkiWiki/Plugin
diff options
context:
space:
mode:
Diffstat (limited to 'IkiWiki/Plugin')
-rw-r--r--IkiWiki/Plugin/comments.pm24
-rw-r--r--IkiWiki/Plugin/edittemplate.pm6
-rw-r--r--IkiWiki/Plugin/filecheck.pm2
-rw-r--r--IkiWiki/Plugin/format.pm24
-rw-r--r--IkiWiki/Plugin/git.pm2
-rw-r--r--IkiWiki/Plugin/goto.pm2
-rw-r--r--IkiWiki/Plugin/highlight.pm33
-rw-r--r--IkiWiki/Plugin/htmlscrubber.pm4
-rw-r--r--IkiWiki/Plugin/htmltidy.pm1
-rw-r--r--IkiWiki/Plugin/inline.pm65
-rw-r--r--IkiWiki/Plugin/meta.pm2
-rw-r--r--IkiWiki/Plugin/more.pm5
-rw-r--r--IkiWiki/Plugin/po.pm2
-rw-r--r--IkiWiki/Plugin/sortnaturally.pm1
-rw-r--r--IkiWiki/Plugin/txt.pm38
-rw-r--r--IkiWiki/Plugin/websetup.pm2
16 files changed, 148 insertions, 65 deletions
diff --git a/IkiWiki/Plugin/comments.pm b/IkiWiki/Plugin/comments.pm
index 851f4862e..a39dab36c 100644
--- a/IkiWiki/Plugin/comments.pm
+++ b/IkiWiki/Plugin/comments.pm
@@ -727,6 +727,10 @@ sub previewcomment ($$$) {
my $page=shift;
my $time=shift;
+ # Previewing a comment should implicitly enable comment posting mode.
+ my $oldpostcomment=$postcomment;
+ $postcomment=1;
+
my $preview = IkiWiki::htmlize($location, $page, '_comment',
IkiWiki::linkify($location, $page,
IkiWiki::preprocess($location, $page,
@@ -745,6 +749,8 @@ sub previewcomment ($$$) {
$template->param(have_actions => 0);
+ $postcomment=$oldpostcomment;
+
return $template->output;
}
@@ -941,14 +947,16 @@ sub match_comment ($$;@) {
my $page = shift;
my $glob = shift;
- # To see if it's a comment, check the source file type.
- # Deal with comments that were just deleted.
- my $source=exists $IkiWiki::pagesources{$page} ?
- $IkiWiki::pagesources{$page} :
- $IkiWiki::delpagesources{$page};
- my $type=defined $source ? IkiWiki::pagetype($source) : undef;
- if (! defined $type || $type ne "_comment") {
- return IkiWiki::FailReason->new("$page is not a comment");
+ if (! $postcomment) {
+ # To see if it's a comment, check the source file type.
+ # Deal with comments that were just deleted.
+ my $source=exists $IkiWiki::pagesources{$page} ?
+ $IkiWiki::pagesources{$page} :
+ $IkiWiki::delpagesources{$page};
+ my $type=defined $source ? IkiWiki::pagetype($source) : undef;
+ if (! defined $type || $type ne "_comment") {
+ return IkiWiki::FailReason->new("$page is not a comment");
+ }
}
return match_glob($page, "$glob/*", internal => 1, @_);
diff --git a/IkiWiki/Plugin/edittemplate.pm b/IkiWiki/Plugin/edittemplate.pm
index 576c94be4..061242fd8 100644
--- a/IkiWiki/Plugin/edittemplate.pm
+++ b/IkiWiki/Plugin/edittemplate.pm
@@ -107,9 +107,11 @@ sub formbuilder (@) {
my $template=$pagestate{$registering_page}{edittemplate}{$pagespec};
$form->field(name => "editcontent",
value => filltemplate($template, $page));
- $form->field(name => "type",
- value => pagetype($pagesources{$template}))
+ my $type=pagetype($pagesources{$template})
if $pagesources{$template};
+ $form->field(name => "type",
+ value => $type)
+ if defined $type;
return;
}
}
diff --git a/IkiWiki/Plugin/filecheck.pm b/IkiWiki/Plugin/filecheck.pm
index 3b0a7b314..4f4e67489 100644
--- a/IkiWiki/Plugin/filecheck.pm
+++ b/IkiWiki/Plugin/filecheck.pm
@@ -161,7 +161,7 @@ sub match_mimetype ($$;@) {
}
my $regexp=IkiWiki::glob2re($wanted);
- if ($mimetype!~/^$regexp$/i) {
+ if ($mimetype!~$regexp) {
return IkiWiki::FailReason->new("file MIME type is $mimetype, not $wanted");
}
else {
diff --git a/IkiWiki/Plugin/format.pm b/IkiWiki/Plugin/format.pm
index d54e71131..b596bc0a1 100644
--- a/IkiWiki/Plugin/format.pm
+++ b/IkiWiki/Plugin/format.pm
@@ -29,22 +29,24 @@ sub preprocess (@) {
if (! defined $format || ! defined $text) {
error(gettext("must specify format and text"));
}
+
+ # Other plugins can register htmlizeformat hooks to add support
+ # for page types not suitable for htmlize, or that need special
+ # processing when included via format. Try them until one succeeds.
+ my $ret;
+ IkiWiki::run_hooks(htmlizeformat => sub {
+ $ret=shift->($format, $text)
+ unless defined $ret;
+ });
+
+ if (defined $ret) {
+ return $ret;
+ }
elsif (exists $IkiWiki::hooks{htmlize}{$format}) {
return IkiWiki::htmlize($params{page}, $params{destpage},
$format, $text);
}
else {
- # Other plugins can register htmlizefallback
- # hooks to add support for page types
- # not suitable for htmlize. Try them until
- # one succeeds.
- my $ret;
- IkiWiki::run_hooks(htmlizefallback => sub {
- $ret=shift->($format, $text)
- unless defined $ret;
- });
- return $ret if defined $ret;
-
error(sprintf(gettext("unsupported page format %s"), $format));
}
}
diff --git a/IkiWiki/Plugin/git.pm b/IkiWiki/Plugin/git.pm
index f5101d904..3fa29b22f 100644
--- a/IkiWiki/Plugin/git.pm
+++ b/IkiWiki/Plugin/git.pm
@@ -688,7 +688,7 @@ sub findtimes ($$) {
if (! keys %time_cache) {
my $date;
foreach my $line (run_or_die('git', 'log',
- '--pretty=format:%ct',
+ '--pretty=format:%at',
'--name-only', '--relative')) {
if (! defined $date && $line =~ /^(\d+)$/) {
$date=$line;
diff --git a/IkiWiki/Plugin/goto.pm b/IkiWiki/Plugin/goto.pm
index 42d2425ca..348a663ef 100644
--- a/IkiWiki/Plugin/goto.pm
+++ b/IkiWiki/Plugin/goto.pm
@@ -52,7 +52,7 @@ sub cgi_goto ($;$) {
IkiWiki::redirect($q, $pagestate{$page}{meta}{permalink});
}
- if (! length $link) {
+ if (! defined $link || ! length $link) {
IkiWiki::cgi_custom_failure(
$q,
"404 Not Found",
diff --git a/IkiWiki/Plugin/highlight.pm b/IkiWiki/Plugin/highlight.pm
index d4ade0a7b..9d05e9fcf 100644
--- a/IkiWiki/Plugin/highlight.pm
+++ b/IkiWiki/Plugin/highlight.pm
@@ -10,8 +10,8 @@ sub import {
hook(type => "getsetup", id => "highlight", call => \&getsetup);
hook(type => "checkconfig", id => "highlight", call => \&checkconfig);
# this hook is used by the format plugin
- hook(type => "htmlizefallback", id => "highlight", call =>
- \&htmlizefallback);
+ hook(type => "htmlizeformat", id => "highlight",
+ call => \&htmlizeformat, last => 1);
}
sub getsetup () {
@@ -79,7 +79,7 @@ sub checkconfig () {
}
}
-sub htmlizefallback {
+sub htmlizeformat {
my $format=lc shift;
my $langfile=ext2langfile($format);
@@ -96,14 +96,29 @@ my %highlighters;
# Parse highlight's config file to get extension => language mappings.
sub read_filetypes () {
- open (IN, $config{filetypes_conf}) || error("$config{filetypes_conf}: $!");
- while (<IN>) {
- chomp;
- if (/^\$ext\((.*)\)=(.*)$/) {
- $ext2lang{$_}=$1 foreach $1, split ' ', $2;
+ open (my $f, $config{filetypes_conf}) || error("$config{filetypes_conf}: $!");
+ local $/=undef;
+ my $config=<$f>;
+ close $f;
+
+ # highlight >= 3.2 format (bind-style)
+ while ($config=~m/Lang\s*=\s*\"([^"]+)\"[,\s]+Extensions\s*=\s*{([^}]+)}/sg) {
+ my $lang=$1;
+ foreach my $bit (split ',', $2) {
+ $bit=~s/.*"(.*)".*/$1/s;
+ $ext2lang{$bit}=$lang;
}
}
- close IN;
+
+ # highlight < 3.2 format
+ if (! keys %ext2lang) {
+ foreach (split("\n", $config)) {
+ if (/^\$ext\((.*)\)=(.*)$/) {
+ $ext2lang{$_}=$1 foreach $1, split ' ', $2;
+ }
+ }
+ }
+
$filetypes_read=1;
}
diff --git a/IkiWiki/Plugin/htmlscrubber.pm b/IkiWiki/Plugin/htmlscrubber.pm
index 927792f79..a58a27d52 100644
--- a/IkiWiki/Plugin/htmlscrubber.pm
+++ b/IkiWiki/Plugin/htmlscrubber.pm
@@ -57,8 +57,8 @@ sub sanitize (@) {
if (exists $config{htmlscrubber_skip} &&
length $config{htmlscrubber_skip} &&
- exists $params{destpage} &&
- pagespec_match($params{destpage}, $config{htmlscrubber_skip})) {
+ exists $params{page} &&
+ pagespec_match($params{page}, $config{htmlscrubber_skip})) {
return $params{content};
}
diff --git a/IkiWiki/Plugin/htmltidy.pm b/IkiWiki/Plugin/htmltidy.pm
index 185d01dd6..1108aeb89 100644
--- a/IkiWiki/Plugin/htmltidy.pm
+++ b/IkiWiki/Plugin/htmltidy.pm
@@ -15,6 +15,7 @@ use IPC::Open2;
sub import {
hook(type => "getsetup", id => "tidy", call => \&getsetup);
hook(type => "sanitize", id => "tidy", call => \&sanitize);
+ hook(type => "checkconfig", id => "tidy", call => \&checkconfig);
}
sub getsetup () {
diff --git a/IkiWiki/Plugin/inline.pm b/IkiWiki/Plugin/inline.pm
index c00aed299..1fe40a5ea 100644
--- a/IkiWiki/Plugin/inline.pm
+++ b/IkiWiki/Plugin/inline.pm
@@ -104,7 +104,7 @@ sub checkconfig () {
}
sub format (@) {
- my %params=@_;
+ my %params=@_;
# Fill in the inline content generated earlier. This is actually an
# optimisation.
@@ -506,26 +506,59 @@ sub date_822 ($) {
}
sub absolute_urls ($$) {
- # sucky sub because rss sucks
- my $content=shift;
+ # needed because rss sucks
+ my $html=shift;
my $baseurl=shift;
my $url=$baseurl;
$url=~s/[^\/]+$//;
+ my $urltop; # calculated if needed
+
+ my $ret="";
- # what is the non path part of the url?
- my $top_uri = URI->new($url);
- $top_uri->path_query(""); # reset the path
- my $urltop = $top_uri->as_string;
-
- $content=~s/(<a(?:\s+(?:class|id)\s*="?\w+"?)?)\s+href=\s*"(#[^"]+)"/$1 href="$baseurl$2"/mig;
- # relative to another wiki page
- $content=~s/(<a(?:\s+(?:class|id)\s*="?\w+"?)?)\s+href=\s*"(?!\w+:)([^\/][^"]*)"/$1 href="$url$2"/mig;
- $content=~s/(<img(?:\s+(?:class|id|width|height)\s*="?\w+"?)*)\s+src=\s*"(?!\w+:)([^\/][^"]*)"/$1 src="$url$2"/mig;
- # relative to the top of the site
- $content=~s/(<a(?:\s+(?:class|id)\s*="?\w+"?)?)\s+href=\s*"(?!\w+:)(\/[^"]*)"/$1 href="$urltop$2"/mig;
- $content=~s/(<img(?:\s+(?:class|id|width|height)\s*="?\w+"?)*)\s+src=\s*"(?!\w+:)(\/[^"]*)"/$1 src="$urltop$2"/mig;
- return $content;
+ eval q{use HTML::Parser; use HTML::Tagset};
+ die $@ if $@;
+ my $p = HTML::Parser->new(api_version => 3);
+ $p->handler(default => sub { $ret.=join("", @_) }, "text");
+ $p->handler(start => sub {
+ my ($tagname, $pos, $text) = @_;
+ if (ref $HTML::Tagset::linkElements{$tagname}) {
+ while (4 <= @$pos) {
+ # use attribute sets from right to left
+ # to avoid invalidating the offsets
+ # when replacing the values
+ my ($k_offset, $k_len, $v_offset, $v_len) =
+ splice(@$pos, -4);
+ my $attrname = lc(substr($text, $k_offset, $k_len));
+ next unless grep { $_ eq $attrname } @{$HTML::Tagset::linkElements{$tagname}};
+ next unless $v_offset; # 0 v_offset means no value
+ my $v = substr($text, $v_offset, $v_len);
+ $v =~ s/^([\'\"])(.*)\1$/$2/;
+ if ($v=~/^#/) {
+ $v=$baseurl.$v; # anchor
+ }
+ elsif ($v=~/^(?!\w+:)[^\/]/) {
+ $v=$url.$v; # relative url
+ }
+ elsif ($v=~/^\//) {
+ if (! defined $urltop) {
+ # what is the non path part of the url?
+ my $top_uri = URI->new($url);
+ $top_uri->path_query(""); # reset the path
+ $urltop = $top_uri->as_string;
+ }
+ $v=$urltop.$v; # url relative to top of site
+ }
+ $v =~ s/\"/&quot;/g; # since we quote with ""
+ substr($text, $v_offset, $v_len) = qq("$v");
+ }
+ }
+ $ret.=$text;
+ }, "tagname, tokenpos, text");
+ $p->parse($html);
+ $p->eof;
+
+ return $ret;
}
sub genfeed ($$$$$@) {
diff --git a/IkiWiki/Plugin/meta.pm b/IkiWiki/Plugin/meta.pm
index 5cfa72833..47007afe2 100644
--- a/IkiWiki/Plugin/meta.pm
+++ b/IkiWiki/Plugin/meta.pm
@@ -355,7 +355,7 @@ sub match {
}
if (defined $val) {
- if ($val=~/^$re$/i) {
+ if ($val=~$re) {
return IkiWiki::SuccessReason->new("$re matches $field of $page", $page => $IkiWiki::DEPEND_CONTENT, "" => 1);
}
else {
diff --git a/IkiWiki/Plugin/more.pm b/IkiWiki/Plugin/more.pm
index 80e339a1b..6880e366d 100644
--- a/IkiWiki/Plugin/more.pm
+++ b/IkiWiki/Plugin/more.pm
@@ -26,7 +26,10 @@ sub preprocess (@) {
$params{linktext} = $linktext unless defined $params{linktext};
- if ($params{page} ne $params{destpage}) {
+ if ($params{page} ne $params{destpage} &&
+ (! exists $params{pages} ||
+ pagespec_match($params{destpage}, $params{pages},
+ location => $params{page}))) {
return "\n".
htmllink($params{page}, $params{destpage}, $params{page},
linktext => $params{linktext},
diff --git a/IkiWiki/Plugin/po.pm b/IkiWiki/Plugin/po.pm
index a79e7d7f0..79142ed1f 100644
--- a/IkiWiki/Plugin/po.pm
+++ b/IkiWiki/Plugin/po.pm
@@ -1297,7 +1297,7 @@ sub match_lang ($$;@) {
my $regexp=IkiWiki::glob2re($wanted);
my $lang=IkiWiki::Plugin::po::lang($page);
- if ($lang !~ /^$regexp$/i) {
+ if ($lang !~ $regexp) {
return IkiWiki::FailReason->new("file language is $lang, not $wanted");
}
else {
diff --git a/IkiWiki/Plugin/sortnaturally.pm b/IkiWiki/Plugin/sortnaturally.pm
index 62e42767c..b038b2f9a 100644
--- a/IkiWiki/Plugin/sortnaturally.pm
+++ b/IkiWiki/Plugin/sortnaturally.pm
@@ -7,6 +7,7 @@ no warnings;
sub import {
hook(type => "getsetup", id => "sortnaturally", call => \&getsetup);
+ hook(type => "checkconfig", id => "sortnaturally", call => \&checkconfig);
}
sub getsetup {
diff --git a/IkiWiki/Plugin/txt.pm b/IkiWiki/Plugin/txt.pm
index 0d9a0b35b..fcfb68be9 100644
--- a/IkiWiki/Plugin/txt.pm
+++ b/IkiWiki/Plugin/txt.pm
@@ -17,6 +17,7 @@ sub import {
hook(type => "getsetup", id => "txt", call => \&getsetup);
hook(type => "filter", id => "txt", call => \&filter);
hook(type => "htmlize", id => "txt", call => \&htmlize);
+ hook(type => "htmlizeformat", id => "txt", call => \&htmlizeformat);
eval q{use URI::Find};
if (! $@) {
@@ -46,25 +47,42 @@ sub filter (@) {
will_render($params{page}, 'robots.txt');
writefile('robots.txt', $config{destdir}, $content);
}
-
- encode_entities($content, "<>&");
- if ($findurl) {
- my $finder = URI::Find->new(sub {
- my ($uri, $orig_uri) = @_;
- return qq|<a href="$uri">$orig_uri</a>|;
- });
- $finder->find(\$content);
- }
- $content = "<pre>" . $content . "</pre>";
+ return txt2html($content);
}
return $content;
}
+sub txt2html ($) {
+ my $content=shift;
+
+ encode_entities($content, "<>&");
+ if ($findurl) {
+ my $finder = URI::Find->new(sub {
+ my ($uri, $orig_uri) = @_;
+ return qq|<a href="$uri">$orig_uri</a>|;
+ });
+ $finder->find(\$content);
+ }
+ return "<pre>" . $content . "</pre>";
+}
+
# We need this to register the .txt file extension
sub htmlize (@) {
my %params=@_;
return $params{content};
}
+sub htmlizeformat ($$) {
+ my $format=shift;
+ my $content=shift;
+
+ if ($format eq 'txt') {
+ return txt2html($content);
+ }
+ else {
+ return;
+ }
+}
+
1
diff --git a/IkiWiki/Plugin/websetup.pm b/IkiWiki/Plugin/websetup.pm
index 0ab18997c..9c032fdc6 100644
--- a/IkiWiki/Plugin/websetup.pm
+++ b/IkiWiki/Plugin/websetup.pm
@@ -475,7 +475,7 @@ sub showform ($$) {
join(" ", @command), $ret).
'</p>';
open(OUT, ">", $config{setupfile}) || error("$config{setupfile}: $!");
- print OUT $oldsetup;
+ print OUT Encode::encode_utf8($oldsetup);
close OUT;
}