X-Git-Url: http://git.vanrenterghem.biz/git.ikiwiki.info.git/blobdiff_plain/5f1e79404588b9f2cbd8fc80d4eb00d7505085c6..79e34c814b153ef1fb8b764ca0a4141543e8129a:/IkiWiki/Render.pm?ds=sidebyside diff --git a/IkiWiki/Render.pm b/IkiWiki/Render.pm index 23f6b1c72..d0d28e802 100644 --- a/IkiWiki/Render.pm +++ b/IkiWiki/Render.pm @@ -1,3 +1,5 @@ +#!/usr/bin/perl + package IkiWiki; use warnings; @@ -16,6 +18,40 @@ sub linkify ($$) { #{{{ 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; @@ -28,11 +64,17 @@ sub htmlize ($$) { #{{{ } 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 ($) { #{{{ @@ -86,12 +128,11 @@ sub rsspage ($) { #{{{ 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; @@ -146,7 +187,7 @@ sub get_inline_content ($$) { #{{{ } } #}}} -sub postprocess_html_inline { #{{{ +sub preprocess_inline ($@) { #{{{ my $parentpage=shift; my %params=@_; @@ -160,7 +201,7 @@ sub postprocess_html_inline { #{{{ $params{show}=10; } $inlinepages{$parentpage}=$params{pages}; - + my $ret=""; if (exists $params{rootpage}) { @@ -177,8 +218,10 @@ sub postprocess_html_inline { #{{{ ? "$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"; @@ -186,7 +229,15 @@ sub postprocess_html_inline { #{{{ $ret.=$template->output; } - return "
$ret"; + # 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 ($$$) { #{{{ @@ -194,8 +245,6 @@ 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, @@ -255,10 +304,9 @@ sub absolute_urls ($$) { #{{{ return $content; } #}}} -sub genrss ($$$) { #{{{ - my $content=shift; +sub genrss ($@) { #{{{ my $page=shift; - my $mtime=shift; + my @pages=@_; my $url="$config{url}/".htmlpage($page); @@ -266,33 +314,14 @@ sub genrss ($$$) { #{{{ 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}, @@ -341,14 +370,15 @@ sub render ($) { #{{{ 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); @@ -356,19 +386,12 @@ sub render ($) { #{{{ 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; }