+#!/usr/bin/perl
+
package IkiWiki;
use warnings;
return $content;
} #}}}
+my $_scrubber;
+sub scrubber { #{{{
+ return $_scrubber if defined $_scrubber;
+
+ eval q{use HTML::Scrubber};
+ # Lists based on http://feedparser.org/docs/html-sanitization.html
+ $_scrubber = HTML::Scrubber->new(
+ allow => [qw{
+ a abbr acronym address area b big blockquote br
+ button caption center cite code col colgroup dd del
+ dfn dir div dl dt em fieldset font form h1 h2 h3 h4
+ h5 h6 hr i img input ins kbd label legend li map
+ menu ol optgroup option p pre q s samp select small
+ span strike strong sub sup table tbody td textarea
+ tfoot th thead tr tt u ul var
+ }],
+ default => [undef, { map { $_ => 1 } qw{
+ abbr accept accept-charset accesskey action
+ align alt axis border cellpadding cellspacing
+ char charoff charset checked cite class
+ clear cols colspan color compact coords
+ datetime dir disabled enctype for frame
+ headers height href hreflang hspace id ismap
+ label lang longdesc maxlength media method
+ multiple name nohref noshade nowrap prompt
+ readonly rel rev rows rowspan rules scope
+ selected shape size span src start summary
+ tabindex target title type usemap valign
+ value vspace width
+ }}],
+ );
+ return $_scrubber;
+} # }}}
+
sub htmlize ($$) { #{{{
my $type=shift;
my $content=shift;
}
if ($type eq '.mdwn') {
- return Markdown::Markdown($content);
+ $content=Markdown::Markdown($content);
}
else {
error("htmlization of $type not supported");
}
+
+ if ($config{sanitize}) {
+ $content=scrubber()->scrub($content);
+ }
+
+ return $content;
} #}}}
sub backlinks ($) { #{{{
return $page.".rss";
} #}}}
-sub postprocess { #{{{
- # Takes content to postprocess followed by a list of postprocessor
- # commands and subroutine references to run for the commands.
+sub preprocess ($$) { #{{{
my $page=shift;
my $content=shift;
- my %commands=@_;
+
+ my %commands=(inline => \&preprocess_inline);
my $handle=sub {
my $escape=shift;
}
} #}}}
-sub postprocess_html_inline { #{{{
+sub preprocess_inline ($@) { #{{{
my $parentpage=shift;
my %params=@_;
$params{show}=10;
}
$inlinepages{$parentpage}=$params{pages};
-
+
my $ret="";
if (exists $params{rootpage}) {
? "$config{templatedir}/inlinepage.tmpl"
: "$config{templatedir}/inlinepagetitle.tmpl"));
+ my @pages;
foreach my $page (blog_list($params{pages}, $params{show})) {
next if $page eq $parentpage;
+ push @pages, $page;
$template->param(pagelink => htmllink($parentpage, $page));
$template->param(content => get_inline_content($parentpage, $page))
if $params{archive} eq "no";
$ret.=$template->output;
}
- return "</p>$ret<p>";
+ # TODO: should really add this to renderedfiles and call
+ # check_overwrite, but currently renderedfiles
+ # only supports listing one file per page.
+ if ($config{rss}) {
+ writefile(rsspage($parentpage), $config{destdir},
+ genrss($parentpage, @pages));
+ }
+
+ return $ret;
} #}}}
sub genpage ($$$) { #{{{
my $page=shift;
my $mtime=shift;
- $content = postprocess($page, $content, inline => \&postprocess_html_inline);
-
my $title=pagetitle(basename($page));
my $template=HTML::Template->new(blind_cache => 1,
return $content;
} #}}}
-sub genrss ($$$) { #{{{
- my $content=shift;
+sub genrss ($@) { #{{{
my $page=shift;
- my $mtime=shift;
+ my @pages=@_;
my $url="$config{url}/".htmlpage($page);
filename => "$config{templatedir}/rsspage.tmpl");
my @items;
- my $isblog=0;
- my $gen_blog=sub {
- my $parentpage=shift;
- my %params=@_;
-
- if (! exists $params{show}) {
- $params{show}=10;
- }
- if (! exists $params{pages}) {
- return "";
- }
-
- $isblog=1;
- foreach my $page (blog_list($params{pages}, $params{show})) {
- next if $page eq $parentpage;
- push @items, {
- itemtitle => pagetitle(basename($page)),
- itemurl => "$config{url}/$renderedfiles{$page}",
- itempubdate => date_822($pagectime{$page}),
- itemcontent => absolute_urls(get_inline_content($parentpage, $page), $url),
- } if exists $renderedfiles{$page};
- }
-
- return "";
- };
-
- $content = postprocess($page, $content, inline => $gen_blog);
+ foreach my $p (@pages) {
+ push @items, {
+ itemtitle => pagetitle(basename($p)),
+ itemurl => "$config{url}/$renderedfiles{$p}",
+ itempubdate => date_822($pagectime{$p}),
+ itemcontent => absolute_urls(get_inline_content($page, $p), $url),
+ } if exists $renderedfiles{$p};
+ }
$template->param(
title => $config{wikiname},
my $type=pagetype($file);
my $srcfile=srcfile($file);
- my $content=readfile($srcfile);
if ($type ne 'unknown') {
+ my $content=readfile($srcfile);
my $page=pagename($file);
$links{$page}=[findlinks($content, $page)];
delete $inlinepages{$page};
$content=linkify($content, $page);
+ $content=preprocess($page, $content);
$content=htmlize($type, $content);
check_overwrite("$config{destdir}/".htmlpage($page), $page);
genpage($content, $page, mtime($srcfile)));
$oldpagemtime{$page}=time;
$renderedfiles{$page}=htmlpage($page);
-
- # TODO: should really add this to renderedfiles and call
- # check_overwrite, as above, but currently renderedfiles
- # only supports listing one file per page.
- if ($config{rss} && exists $inlinepages{$page}) {
- writefile(rsspage($page), $config{destdir},
- genrss($content, $page, mtime($srcfile)));
- }
}
else {
+ my $content=readfile($srcfile, 1);
$links{$file}=[];
check_overwrite("$config{destdir}/$file", $file);
- writefile($file, $config{destdir}, $content);
+ writefile($file, $config{destdir}, $content, 1);
$oldpagemtime{$file}=time;
$renderedfiles{$file}=$file;
}
);
print TEMPLATE $template->output;
close TEMPLATE;
- symlink("/usr/lib/estraier/estseek.cgi",
- "$estdir/".basename($config{cgiurl})) ||
- error("symlink: $!");
+ $cgi="$estdir/".basename($config{cgiurl});
+ unlink($cgi);
+ symlink("/usr/lib/estraier/estseek.cgi", $cgi) ||
+ error("symlink $cgi: $!");
} # }}}
sub estcmd ($;@) { #{{{