aboutsummaryrefslogtreecommitdiff
path: root/rtest.pl
diff options
context:
space:
mode:
Diffstat (limited to 'rtest.pl')
-rw-r--r--rtest.pl124
1 files changed, 124 insertions, 0 deletions
diff --git a/rtest.pl b/rtest.pl
new file mode 100644
index 0000000..df031fd
--- /dev/null
+++ b/rtest.pl
@@ -0,0 +1,124 @@
+#!/usr/bin/perl
+use strict;
+use warnings;
+use XML::LibXML;
+use Text::Restructured;
+use YAML;
+
+my $input=<<'EOF';
+======
+ Test
+======
+:Author: dakkar
+
+paragrafo
+
+link
+
+mathml: :mathml:`x^2`
+
+.. mathml::
+
+ (x^2)/(y^2)
+
+pre::
+
+ gino pino
+ rino
+
+normale
+
+:titlink:`/path/al/doc/`
+
+EOF
+my $name='--inline--';
+
+my $opts={
+ D => {
+ generator => 0,
+ 'source-link' => 0,
+ 'time' => 0,
+ },
+};
+my $parser=Text::Restructured->new($opts,'gino');
+if (@ARGV) {
+ $name=$ARGV[0];
+ $input=do{open my $fh,'<',$name;local $/;<$fh>};
+}
+
+# bad MNODINE, no cookie
+# MY_ROLES gets re-inited before every Parse, so I have to change a
+# global variable
+$Text::Restructured::ROLES{titlink}={
+ tag => 'reference',
+ attr => {
+ refuri => '%s',
+ role => sub {
+ my ($parser,$attr,$text,$role)=@_;
+ $role;
+ }
+ },
+ text => 'dummy',
+};
+
+my $dudom=$parser->Parse($input,$name);
+
+my $xdoc=XML::LibXML->createDocument();
+
+my $MATHML='http://www.w3.org/1998/Math/MathML';
+sub mathml2xml {
+ my ($mnode)=@_;
+
+ if ($mnode->isText) {
+ return $xdoc->createTextNode($mnode->nodeValue);
+ }
+
+
+ my @children=map {mathml2xml($_)}
+ $mnode->childNodes();
+
+ my $elem=$xdoc->createElementNS($MATHML,$mnode->nodeName);
+ for my $attname ($mnode->attributeList) {
+ next if $attname eq 'xmlns';
+ $elem->setAttribute($attname,
+ $mnode->attribute($attname))
+ }
+
+ $elem->appendChild($_) for @children;
+
+ return $elem;
+}
+
+sub docutils2xml {
+ my ($dunode)=@_;
+
+ if ($dunode->{tag} eq '#PCDATA') {
+ return $xdoc->createTextNode($dunode->{text} || '');
+ }
+
+ if ($dunode->{tag} eq 'mathml') {
+ return mathml2xml($dunode->{attr}{mathml});
+ }
+
+ my @children=map {docutils2xml($_)}
+ @{ $dunode->{content} || [] };
+
+ my $elem=$xdoc->createElement($dunode->{tag});
+
+ if (defined $dunode->{attr}) {
+ while (my ($attname,$attval)=each %{$dunode->{attr}}) {
+ if (! defined $attval) {
+ $attval='';
+ }
+ elsif (ref($attval) eq 'ARRAY') {
+ $attval=join ' ',@$attval;
+ }
+ $elem->setAttribute($attname,$attval);
+ }
+ }
+ $elem->appendChild($_) for @children;
+
+ return $elem;
+}
+$xdoc->setDocumentElement(docutils2xml($dudom));
+print $xdoc->toString();