Render html field
EPrints::Extras provides a render_xhtml_field but that method only works with well-formed XML.
This method uses the HTML::Parser tool to render plain-HTML:
use HTML::Parser;
sub render_html_field
{
my( $repo, $field, $value ) = @_;
my $xml = $repo->xml;
my $frag = $xml->create_document_fragment;
my %compress = map { $_ => 1 } @EPrints::XML::COMPRESS_TAGS;
my $c = $frag;
my $p = HTML::Parser->new(
api_version => 3,
start_h => [sub {
eval { if( $compress{$_[0]} )
{
$c->appendChild( $xml->create_element( @_ ) )
}
else
{
$c = $c->appendChild( $xml->create_element( @_ ) )
} };
$c->appendChild( $xml->create_text_node( "Error parsing '@_': $@" ) ) if $@;
}, 'tagname,@attr'],
end_h => [sub { $c = $c->parentNode if $c->nodeName eq $_[0] && !$compress{$_[0]} }, 'tagname' ],
text_h => [sub { $c->appendChild( $xml->create_text_node( Encode::encode_utf8($_[0]) ) ) }, 'dtext'],
);
$p->empty_element_tags( 1 );
$p->strict_end( 1 );
$p->parse( $value );
$p->eof;
return $frag;
}
To use this method drop the above into a cfg.d script - recommend you use the name '00_render_html_field.pl' to ensure it's loaded before use. Add this to a field definition:
render_value => \&render_html_field,