package WebCoso::Step::ReST::ToXml;
use strict;
use warnings;
use base 'WebCoso::Step';
use Class::Std;
use Inline 'Python';
use XML::LibXML;
use Encode;
{
my $xml_parser=XML::LibXML->new();
$xml_parser->load_ext_dtd(0);
$xml_parser->clean_namespaces(1);
sub process {
my ($self,$resource,$stage)=@_;
return unless $stage eq 'meta';
my ($src_path)=$resource->get_axis_values('filename');
my ($rst_doc,$xml_dom);
$rst_doc=$resource->get_property('rstdoc');
if (defined $rst_doc) {
$resource->set_property(
'xmldom',
rst2xml($rst_doc,$src_path)
);
}
else {
my @langs=$resource->get_axis_values('language');
for my $cur_lang (@langs) {
$rst_doc=$resource->get_property({language=>$cur_lang},'rstdoc');
$resource->set_property(
{language=>$cur_lang},
'xmldom',
rst2xml($rst_doc,$src_path,$cur_lang)
);
}
}
return;
}
sub rst2xml {
my ($rst_string,$source_path,$language)=@_;
$rst_string=Encode::encode('utf-8',$rst_string);
my $xml_string=_rst2xml($rst_string,$source_path,$language||'it');
$xml_parser->base_uri($source_path);
return $xml_parser->parse_string($xml_string);
}
}
1;
__DATA__
__Python__
import locale
import docutils.core
def _rst2xml(source,source_path,language):
return docutils.core.publish_string(
source,source_path=source_path,
writer_name='xml',
settings_overrides={
'input_encoding':'utf-8',
'output_encoding':'utf-8',
'language_code':language,
},
)