2008-11-16 19:11:39 +01:00
|
|
|
#!/usr/bin/perl
|
|
|
|
package IkiWiki::Plugin::htmlbalance;
|
|
|
|
|
|
|
|
# htmlbalance: Parse and re-serialize HTML to ensure balanced tags
|
|
|
|
#
|
|
|
|
# Copyright 2008 Simon McVittie <http://smcv.pseudorandom.co.uk/>
|
|
|
|
# Licensed under the GNU GPL, version 2, or any later version published by the
|
|
|
|
# Free Software Foundation
|
|
|
|
|
|
|
|
use warnings;
|
|
|
|
use strict;
|
|
|
|
use IkiWiki 2.00;
|
2008-11-17 20:19:15 +01:00
|
|
|
use HTML::TreeBuilder;
|
2008-11-17 20:27:11 +01:00
|
|
|
use HTML::Entities;
|
2008-11-16 19:11:39 +01:00
|
|
|
|
|
|
|
sub import { #{{{
|
|
|
|
hook(type => "getsetup", id => "htmlbalance", call => \&getsetup);
|
|
|
|
hook(type => "sanitize", id => "htmlbalance", call => \&sanitize);
|
|
|
|
} # }}}
|
|
|
|
|
|
|
|
sub getsetup () { #{{{
|
|
|
|
return
|
|
|
|
plugin => {
|
|
|
|
safe => 1,
|
|
|
|
rebuild => undef,
|
|
|
|
},
|
|
|
|
} #}}}
|
|
|
|
|
|
|
|
sub sanitize (@) { #{{{
|
|
|
|
my %params=@_;
|
|
|
|
my $ret = '';
|
|
|
|
|
|
|
|
my $tree = HTML::TreeBuilder->new_from_content($params{content});
|
|
|
|
my @nodes = $tree->disembowel();
|
|
|
|
foreach my $node (@nodes) {
|
|
|
|
if (ref $node) {
|
|
|
|
$ret .= $node->as_XML();
|
|
|
|
chomp $ret;
|
|
|
|
$node->delete();
|
|
|
|
}
|
|
|
|
else {
|
2008-11-17 20:27:11 +01:00
|
|
|
$ret .= encode_entities($node);
|
2008-11-16 19:11:39 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
$tree->delete();
|
|
|
|
return $ret;
|
|
|
|
} # }}}
|
|
|
|
|
|
|
|
1
|