From 6baf5b52e18811f2b44d35a5dcc1a51d6071ce8b Mon Sep 17 00:00:00 2001 From: dakkar Date: Tue, 17 Jul 2007 15:27:31 +0000 Subject: r2493@narval: dakkar | 2007-07-17 10:42:29 +0200 importo il modulo ReST-XML git-svn-id: svn://luxion/repos/Text-Restructured-Writer-LibXML@257 fcb26f47-9200-0410-b104-b98ab5b095f3 --- .cvsignore | 0 Build.PL | 31 +++++++++ Changes | 5 ++ MANIFEST | 10 +++ README | 6 ++ lib/Text/Restructured/Writer/LibXML.pm | 118 +++++++++++++++++++++++++++++++++ t/00-load.t | 7 ++ t/00-pod-coverage.t | 7 ++ t/00-pod.t | 7 ++ t/00-prereqs.t | 6 ++ t/01-basic.t | 79 ++++++++++++++++++++++ 11 files changed, 276 insertions(+) create mode 100644 .cvsignore create mode 100644 Build.PL create mode 100644 Changes create mode 100644 MANIFEST create mode 100644 README create mode 100644 lib/Text/Restructured/Writer/LibXML.pm create mode 100644 t/00-load.t create mode 100644 t/00-pod-coverage.t create mode 100644 t/00-pod.t create mode 100644 t/00-prereqs.t create mode 100644 t/01-basic.t diff --git a/.cvsignore b/.cvsignore new file mode 100644 index 0000000..e69de29 diff --git a/Build.PL b/Build.PL new file mode 100644 index 0000000..9999a86 --- /dev/null +++ b/Build.PL @@ -0,0 +1,31 @@ + +use strict; +use warnings; +use Module::Build; + +my $builder = Module::Build->new( + module_name => 'Text::Restructured::Writer::LibXML', + license => 'perl', + dist_name => 'Text-Restructured-Writer-LibXML', + dist_abstract => <<'END_ABSTRACT', +This module implements a "Writer" for Text::Restructured, that instead +of returning a string, returns a LibXML DOM. +END_ABSTRACT + dist_author => 'Gianni Ceccarelli ', + dist_version_from => 'lib/Text/Restructured/Writer/LibXML.pm', + requires => { + 'Text::Restructured' => 0.003031, + 'XML::LibXML' => 1.61, + }, + build_requires => { + 'Test::More' => 0, + 'XML::LibXML::XPathContext' => 1.61, + }, + add_to_cleanup => [ 'Text-Restructured-Writer-LibXML-*' ], + create_makefile_pl => 'traditional', + create_packlist => 1, + recursive_test_files=> 1, + sign => 1, +); + +$builder->create_build_script(); diff --git a/Changes b/Changes new file mode 100644 index 0000000..2ff0653 --- /dev/null +++ b/Changes @@ -0,0 +1,5 @@ +Revision history for Text-Restructured-Writer-LibXML + +0.01 2007-07-16 + First version. + diff --git a/MANIFEST b/MANIFEST new file mode 100644 index 0000000..7c1b0b5 --- /dev/null +++ b/MANIFEST @@ -0,0 +1,10 @@ +Build.PL +Changes +MANIFEST +META.yml # Will be created by "make dist" +README +lib/Text/Restructured/Writer/LibXML.pm +t/00-load.t +t/00-pod-coverage.t +t/00-pod.t +t/00-prereqs.t diff --git a/README b/README new file mode 100644 index 0000000..5188c13 --- /dev/null +++ b/README @@ -0,0 +1,6 @@ +This module implements a "Writer" for Text::Restructured, that instead +of returning a string, returns a LibXML DOM. + +The DOM will have non-namespaced elements according to the docutils +vocabulary, and namespcaed elements according to the MathML +vocabulary. diff --git a/lib/Text/Restructured/Writer/LibXML.pm b/lib/Text/Restructured/Writer/LibXML.pm new file mode 100644 index 0000000..99ef206 --- /dev/null +++ b/lib/Text/Restructured/Writer/LibXML.pm @@ -0,0 +1,118 @@ +package Text::Restructured::Writer::LibXML; +use strict; +use warnings; +use XML::LibXML; + +$Text::Restructured::Writer::LibXML::VERSION='0.01'; + +=head1 NAME + +Text::Restructured::Writer::LibXML + +=head1 SYNOPSIS + + use Text::Restructured; + use Text::Restructured::Writer::LibXML; + + my $parser=Text::Restructured->new($opts,'gino'); + my $dudom=$parser->Parse($input,$filename); + my $xdoc=Text::Restructured::Writer::LibXML->new->ProcessDOM($dudom); + +=head1 DESCRIPTION + +This module implements a "Writer" for L, that +instead of returning a string, returns a L DOM. + +The DOM will have non-namespaced elements according to the docutils +vocabulary, and namespcaed elements according to the MathML +vocabulary. + +This is probably the fastest way to transform a +L structure into a proper XML DOM. + +=head1 METHODS + +=head2 C + +Returns a new object. + +=cut + +sub new { + my ($class)=@_; + return bless {},$class; +} + +=head2 IC<= ProcessDOM(>IC<)> + +Given an object of type L, processes it +recursively and builds an XML DOM into a new document. Returns the +document, or dies trying. + +=cut + +sub ProcessDOM { + my ($self,$dudom)=@_; + my $xdoc=XML::LibXML->createDocument(); + $xdoc->setDocumentElement(_docutils2xml($dudom,$xdoc)); + return $xdoc; +} + +my $MATHML='http://www.w3.org/1998/Math/MathML'; + +sub _mathml2xml { + my ($mnode,$xdoc)=@_; + + if ($mnode->isText) { + return $xdoc->createTextNode($mnode->nodeValue); + } + + + my @children=map {_mathml2xml($_,$xdoc)} + $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,$xdoc)=@_; + + if ($dunode->{tag} eq '#PCDATA') { + return $xdoc->createTextNode($dunode->{text} || ''); + } + + if ($dunode->{tag} eq 'mathml') { + return _mathml2xml($dunode->{attr}{mathml},$xdoc); + } + + my @children=map {_docutils2xml($_,$xdoc)} + @{ $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; +} + +1; diff --git a/t/00-load.t b/t/00-load.t new file mode 100644 index 0000000..f152344 --- /dev/null +++ b/t/00-load.t @@ -0,0 +1,7 @@ +use Test::More tests => 1; + +BEGIN { + use_ok('Text::Restructured::Writer::LibXML'); +} + +diag( "Testing Text::Restructured::Writer::LibXML $Text::Restructured::Writer::LibXML::VERSION" ); diff --git a/t/00-pod-coverage.t b/t/00-pod-coverage.t new file mode 100644 index 0000000..011042e --- /dev/null +++ b/t/00-pod-coverage.t @@ -0,0 +1,7 @@ +use Test::More; +plan skip_all => 'Set DEVEL_TESTS to run these tests' + unless $ENV{DEVEL_TESTS}; +eval "use Test::Pod::Coverage 1.04"; +plan skip_all => "Test::Pod::Coverage 1.04 required for testing POD coverage" + if $@; +all_pod_coverage_ok(); diff --git a/t/00-pod.t b/t/00-pod.t new file mode 100644 index 0000000..3681990 --- /dev/null +++ b/t/00-pod.t @@ -0,0 +1,7 @@ +use Test::More; +plan skip_all => 'Set DEVEL_TESTS to run these tests' + unless $ENV{DEVEL_TESTS}; +eval "use Test::Pod 1.14"; +plan skip_all => "Test::Pod 1.14 required for testing POD" + if $@; +all_pod_files_ok(); diff --git a/t/00-prereqs.t b/t/00-prereqs.t new file mode 100644 index 0000000..5bfc2c6 --- /dev/null +++ b/t/00-prereqs.t @@ -0,0 +1,6 @@ +use Test::More; +plan skip_all => 'Set DEVEL_TESTS to run these tests' + unless $ENV{DEVEL_TESTS}; +eval "use Test::Prereq::Build"; +plan skip_all => "Test::Prereq::Build required to test dependencies" if $@; +prereq_ok(); diff --git a/t/01-basic.t b/t/01-basic.t new file mode 100644 index 0000000..94ba201 --- /dev/null +++ b/t/01-basic.t @@ -0,0 +1,79 @@ +use Test::More tests => 10; +use strict; +use warnings; +use Text::Restructured; +use Text::Restructured::Writer::LibXML; +use XML::LibXML::XPathContext; + +my $input=<<'EOF'; +====== + Test +====== +:Author: dakkar + +paragrafo + +link_ + +.. _link: /gino/pino/ + +mathml: :mathml:`x^2` + +.. mathml:: + + (x^2)/(y^2) + +pre:: + + gino pino + rino + +normale + +EOF + +my $opts={ + D => { + generator => 0, + 'source-link' => 0, + 'time' => 0, + }, +}; +my $parser=Text::Restructured->new($opts,'gino'); +my $dudom=$parser->Parse($input,'--inline--'); +my $xdoc=Text::Restructured::Writer::LibXML->new->ProcessDOM($dudom); + +my $ctx=XML::LibXML::XPathContext->new($xdoc); +$ctx->registerNs('m','http://www.w3.org/1998/Math/MathML'); +sub xis { + my ($expr,$val,$comment)=@_; + is $ctx->findvalue($expr), + $val, + $comment||''; +} + +=begin comment + +Test +dakkar +paragrafo +linkmathml: x2x2y2pre: + gino pino +rino +normale + + +=end comment + +=cut + +xis '/document/@source','--inline--','Source name'; +xis '/document/@title','Test','Title'; +xis '/document/docinfo/author',"dakkar\n",'Author'; +xis 'count(/document/paragraph)',6,'Paragraphs'; +xis '/document/paragraph[1]',"paragrafo\n",'para 1'; +xis '/document/paragraph[2]/reference/@refuri','/gino/pino/','Ref'; +xis '/document/paragraph[3]/m:math','x2','MathML 1'; +xis '/document/paragraph[4]/m:math','x2y2','MathML 2'; +xis 'name(/document/paragraph[5]/following-sibling::*[1])','literal_block','Literal'; +xis '/document/literal_block'," gino pino\nrino\n",'Literal content'; -- cgit v1.2.3