540662c2b4d1fcc0cf1c8a0a89d08c3c0eabe280
[ikiwiki.git] / IkiWiki / Plugin / htmlscrubber.pm
1 #!/usr/bin/perl
2 package IkiWiki::Plugin::htmlscrubber;
3
4 use warnings;
5 use strict;
6 use IkiWiki 2.00;
7
8 sub import { #{{{
9         hook(type => "sanitize", id => "htmlscrubber", call => \&sanitize);
10 } # }}}
11
12 sub sanitize (@) { #{{{
13         my %params=@_;
14         return scrubber()->scrub($params{content});
15 } # }}}
16
17 my $_scrubber;
18 sub scrubber { #{{{
19         return $_scrubber if defined $_scrubber;
20         
21         eval q{use HTML::Scrubber};
22         error($@) if $@;
23         # Lists based on http://feedparser.org/docs/html-sanitization.html
24         $_scrubber = HTML::Scrubber->new(
25                 allow => [qw{
26                         a abbr acronym address area b big blockquote br
27                         button caption center cite code col colgroup dd del
28                         dfn dir div dl dt em fieldset font form h1 h2 h3 h4
29                         h5 h6 hr i img input ins kbd label legend li map
30                         menu ol optgroup option p pre q s samp select small
31                         span strike strong sub sup table tbody td textarea
32                         tfoot th thead tr tt u ul var
33                 }],
34                 default => [undef, { (
35                         map { $_ => 1 } qw{
36                                 abbr accept accept-charset accesskey action
37                                 align alt axis border cellpadding cellspacing
38                                 char charoff charset checked cite class
39                                 clear cols colspan color compact coords
40                                 datetime dir disabled enctype for frame
41                                 headers height href hreflang hspace id ismap
42                                 label lang longdesc maxlength media method
43                                 multiple name nohref noshade nowrap prompt
44                                 readonly rel rev rows rowspan rules scope
45                                 selected shape size span src start summary
46                                 tabindex target title type usemap valign
47                                 value vspace width
48                         } ),
49                         "/" => 1, # emit proper <hr /> XHTML
50                         }],
51         );
52         return $_scrubber;
53 } # }}}
54
55 1