Commits

Anonymous committed 975bc26

Add XML::Grammar::Screenplay::ToTEI. Test the conversion.

Add the class to do the converstion to TEI using the XSLT transform.

Test that it's OK using a test script.

  • Participants
  • Parent commits 887754f

Comments (0)

Files changed (37)

File perl/modules/XML-Grammar-Fiction/MANIFEST

 lib/XML/Grammar/Screenplay.pm
 lib/XML/Grammar/Screenplay/ToDocBook.pm
 lib/XML/Grammar/Screenplay/ToHTML.pm
+lib/XML/Grammar/Screenplay/ToTEI.pm
 Makefile.PL
 MANIFEST
 META.yml # Will be created by "make dist"
 t/screenplay/data/proto-text/with-multi-para-desc.txt
 t/screenplay/data/proto-text/with-numeric-entities.txt
 t/screenplay/data/proto-text/with-tags-inside-paragraphs.txt
+t/screenplay/data/tei/dialogue-with-several-paragraphs.tei.xml
+t/screenplay/data/tei/nested-s.tei.xml
+t/screenplay/data/tei/scenes-with-titles.tei.xml
+t/screenplay/data/tei/two-nested-s.tei.xml
+t/screenplay/data/tei/with-brs.tei.xml
+t/screenplay/data/tei/with-colon-inside-description.tei.xml
+t/screenplay/data/tei/with-comments.tei.xml
+t/screenplay/data/tei/with-description.tei.xml
+t/screenplay/data/tei/with-dialogue.tei.xml
+t/screenplay/data/tei/with-entities.tei.xml
+t/screenplay/data/tei/with-i-element-inside-paragraphs.tei.xml
+t/screenplay/data/tei/with-internal-description-at-start-of-line.tei.xml
+t/screenplay/data/tei/with-internal-description.tei.xml
+t/screenplay/data/tei/with-multi-line-comments.tei.xml
+t/screenplay/data/tei/with-multi-para-desc.tei.xml
+t/screenplay/data/tei/with-numeric-entities.tei.xml
+t/screenplay/data/tei/with-tags-inside-paragraphs.tei.xml
 t/screenplay/data/xml/dialogue-with-several-paragraphs.xml
 t/screenplay/data/xml/nested-s.xml
 t/screenplay/data/xml/scenes-with-titles.xml
 t/screenplay/proto-text-to-xml-using-custom-parser.t
 t/screenplay/qnd-parser-unit.t
 t/screenplay/to-docbook.t
+t/screenplay/to-tei.t
 t/screenplay/to-xhtml.t

File perl/modules/XML-Grammar-Fiction/lib/XML/Grammar/Screenplay/ToTEI.pm

+package XML::Grammar::Screenplay::ToTEI;
+
+use strict;
+use warnings;
+
+use Carp;
+use File::Spec;
+
+use XML::LibXSLT;
+
+use File::ShareDir ':ALL';
+
+use XML::LibXML;
+use XML::LibXSLT;
+
+use base 'XML::Grammar::Screenplay::Base';
+
+use Moose;
+
+
+has '_data_dir' => (isa => 'Str', is => 'rw');
+has '_rng' => (isa => 'XML::LibXML::RelaxNG', is => 'rw');
+has '_xml_parser' => (isa => "XML::LibXML", is => 'rw');
+has '_stylesheet' => (isa => "XML::LibXSLT::StylesheetWrapper", is => 'rw');
+
+=head1 NAME
+
+XML::Grammar::Screenplay::ToTEI - module that converts the Screenplay
+XML to TEI (Text Encoding Initiative).
+
+=head1 VERSION
+
+Version 0.2.0
+
+=cut
+
+our $VERSION = '0.2.0';
+
+=head2 new()
+
+Accepts no arguments so far. May take some time as the grammar is compiled
+at that point.
+
+=head2 meta()
+
+Internal - (to settle pod-coverage.).
+
+=cut
+
+sub _init
+{
+    my ($self, $args) = @_;
+
+    my $data_dir = $args->{'data_dir'} ||
+        dist_dir( 'XML-Grammar-Fiction');
+
+    $self->_data_dir($data_dir);
+
+    my $rngschema =
+        XML::LibXML::RelaxNG->new(
+            location =>
+            File::Spec->catfile(
+                $self->_data_dir(), 
+                "screenplay-xml.rng"
+            ),
+        );
+
+    $self->_rng($rngschema);
+
+    $self->_xml_parser(XML::LibXML->new());
+
+    my $xslt = XML::LibXSLT->new();
+
+    my $style_doc = $self->_xml_parser()->parse_file(
+            File::Spec->catfile(
+                $self->_data_dir(), 
+                "screenplay-xml-to-tei.xslt"
+            ),
+        );
+
+    $self->_stylesheet($xslt->parse_stylesheet($style_doc));
+
+    return 0;
+}
+
+=head2 $converter->translate_to_tei({source => {file => $filename}, output => "string" })
+
+Does the actual conversion. $filename is the filename to translate (currently
+the only available source). 
+
+The C<'output'> key specifies the return value. A value of C<'string'> returns 
+the XML as a string, and a value of C<'xml'> returns the XML as an 
+L<XML::LibXML> DOM object.
+
+=cut
+
+sub translate_to_tei
+{
+    my ($self, $args) = @_;
+
+    my $source_dom =
+        $self->_xml_parser()->parse_file($args->{source}->{file})
+        ;
+
+    my $ret_code;
+
+    eval
+    {
+        $ret_code = $self->_rng()->validate($source_dom);
+    };
+
+    if (defined($ret_code) && ($ret_code == 0))
+    {
+        # It's OK.
+    }
+    else
+    {
+        confess "RelaxNG validation failed [\$ret_code == $ret_code ; $@]";
+    }
+
+    my $stylesheet = $self->_stylesheet();
+
+    my $results = $stylesheet->transform($source_dom);
+
+    my $medium = $args->{output};
+
+    if ($medium eq "string")
+    {
+        return $stylesheet->output_string($results);
+    }
+    elsif ($medium eq "xml")
+    {
+        return $results;
+    }
+    else
+    {
+        confess "Unknown medium";
+    }
+}
+
+=head1 AUTHOR
+
+Shlomi Fish, L<http://www.shlomifish.org/>.
+
+=head1 BUGS
+
+Please report any bugs or feature requests to
+C<bug-xml-grammar-screenplay at rt.cpan.org>, or through the web interface at
+L<http://rt.cpan.org/NoAuth/ReportBug.html?Queue=XML-Grammar-Screenplay>.
+I will be notified, and then you'll automatically be notified of progress on
+your bug as I make changes.
+
+
+=head1 ACKNOWLEDGEMENTS
+
+=head1 COPYRIGHT & LICENSE
+
+Copyright 2007 Shlomi Fish, all rights reserved.
+
+This program is released under the following license: MIT X11.
+
+=cut
+
+1;
+

File perl/modules/XML-Grammar-Fiction/t/screenplay/data/tei/dialogue-with-several-paragraphs.tei.xml

+<?xml version="1.0" encoding="UTF-8"?>
+<tei:text xmlns:tei="http://www.tei-c.org/ns/1.0" xmlns:sp="http://web-cpan.berlios.de/modules/XML-Grammar-Screenplay/screenplay-xml-0.2/">
+  <tei:body>
+    <tei:div type="act" xml:id="index">
+      <tei:head>ACT I</tei:head>
+      <tei:div type="scene" xml:id="top">
+        <tei:head>top</tei:head>
+        <tei:div type="scene" xml:id="david_and_goliath">
+          <tei:head>david_and_goliath</tei:head>
+          <tei:sp><tei:speaker>David</tei:speaker>
+            <tei:p>
+                I will kill you.
+            </tei:p>
+        </tei:sp>
+          <tei:sp><tei:speaker>Goliath</tei:speaker>
+            <tei:p>
+                no way, you little idiot!
+            </tei:p>
+        </tei:sp>
+          <tei:sp><tei:speaker>David</tei:speaker>
+            <tei:p>
+                yes way!
+            </tei:p>
+            <tei:p>
+                In the name of Allah, the merciful, I will show you the power 
+                of my sling.
+            </tei:p>
+            <tei:p>
+                I shall sling you and bing you till infinity.
+            </tei:p>
+        </tei:sp>
+          <tei:sp><tei:speaker>Goliath</tei:speaker>
+            <tei:p>
+                I'm still waiting.
+            </tei:p>
+        </tei:sp>
+          <tei:sp><tei:speaker>David</tei:speaker>
+            <tei:p>
+                so you are.
+            </tei:p>
+        </tei:sp>
+        </tei:div>
+      </tei:div>
+    </tei:div>
+  </tei:body>
+</tei:text>

File perl/modules/XML-Grammar-Fiction/t/screenplay/data/tei/nested-s.tei.xml

+<?xml version="1.0" encoding="UTF-8"?>
+<tei:text xmlns:tei="http://www.tei-c.org/ns/1.0" xmlns:sp="http://web-cpan.berlios.de/modules/XML-Grammar-Screenplay/screenplay-xml-0.2/">
+  <tei:body>
+    <tei:div type="act" xml:id="index">
+      <tei:head>ACT I</tei:head>
+      <tei:div type="scene" xml:id="top">
+        <tei:head>top</tei:head>
+        <tei:div type="scene" xml:id="a-better-scene">
+          <tei:head>a-better-scene</tei:head>
+        </tei:div>
+      </tei:div>
+    </tei:div>
+  </tei:body>
+</tei:text>

File perl/modules/XML-Grammar-Fiction/t/screenplay/data/tei/scenes-with-titles.tei.xml

+<?xml version="1.0" encoding="UTF-8"?>
+<tei:text xmlns:tei="http://www.tei-c.org/ns/1.0" xmlns:sp="http://web-cpan.berlios.de/modules/XML-Grammar-Screenplay/screenplay-xml-0.2/">
+  <tei:body>
+    <tei:div type="act" xml:id="index">
+      <tei:head>ACT I</tei:head>
+      <tei:div type="scene" xml:id="top">
+        <tei:head>top</tei:head>
+        <tei:div type="scene" xml:id="a-better-scene">
+          <tei:head>A Better Scene</tei:head>
+        </tei:div>
+        <tei:div type="scene" xml:id="another-scene">
+          <tei:head>another-scene</tei:head>
+        </tei:div>
+        <tei:div type="scene" xml:id="exodus">
+          <tei:head>The Exodus</tei:head>
+          <tei:sp><tei:speaker>Moses</tei:speaker>
+                    <tei:p>
+                        let us get out of here!
+                    </tei:p>
+                </tei:sp>
+          <tei:sp><tei:speaker>Joshua</tei:speaker>
+                    <tei:p>
+                        amen!
+                    </tei:p>
+                </tei:sp>
+        </tei:div>
+      </tei:div>
+    </tei:div>
+  </tei:body>
+</tei:text>

File perl/modules/XML-Grammar-Fiction/t/screenplay/data/tei/two-nested-s.tei.xml

+<?xml version="1.0" encoding="UTF-8"?>
+<tei:text xmlns:tei="http://www.tei-c.org/ns/1.0" xmlns:sp="http://web-cpan.berlios.de/modules/XML-Grammar-Screenplay/screenplay-xml-0.2/">
+  <tei:body>
+    <tei:div type="act" xml:id="index">
+      <tei:head>ACT I</tei:head>
+      <tei:div type="scene" xml:id="top">
+        <tei:head>top</tei:head>
+        <tei:div type="scene" xml:id="a-better-scene">
+          <tei:head>a-better-scene</tei:head>
+        </tei:div>
+        <tei:div type="scene" xml:id="another-scene">
+          <tei:head>another-scene</tei:head>
+        </tei:div>
+      </tei:div>
+    </tei:div>
+  </tei:body>
+</tei:text>

File perl/modules/XML-Grammar-Fiction/t/screenplay/data/tei/with-brs.tei.xml

+<?xml version="1.0" encoding="UTF-8"?>
+<tei:text xmlns:tei="http://www.tei-c.org/ns/1.0" xmlns:sp="http://web-cpan.berlios.de/modules/XML-Grammar-Screenplay/screenplay-xml-0.2/">
+  <tei:body>
+    <tei:div type="act" xml:id="index">
+      <tei:head>ACT I</tei:head>
+      <tei:div type="scene" xml:id="top">
+        <tei:head>top</tei:head>
+        <tei:div type="scene" xml:id="david_and_goliath">
+          <tei:head>david_and_goliath</tei:head>
+          <tei:stage>
+            <tei:p>
+                David and 
+                <tei:ref target="http://en.wikipedia.org/wiki/Goliath">Goliath</tei:ref> 
+                are standing by each other.
+            </tei:p>
+        </tei:stage>
+          <tei:sp><tei:speaker>David</tei:speaker>
+            <tei:p>
+                I will kill you.<tei:lb/>
+                I will kill you.<tei:lb/>
+                You will not survive.<tei:lb/>
+                I will kill you.<tei:lb/>
+                I will kill you.<tei:lb/>
+                Ask Jive.
+            </tei:p>
+        </tei:sp>
+          <tei:sp><tei:speaker>Goliath</tei:speaker>
+            <tei:p>
+                no way, you little idiot!
+            </tei:p>
+        </tei:sp>
+          <tei:sp><tei:speaker>David</tei:speaker>
+            <tei:p>
+                yes way!
+            </tei:p>
+        </tei:sp>
+        </tei:div>
+      </tei:div>
+    </tei:div>
+  </tei:body>
+</tei:text>

File perl/modules/XML-Grammar-Fiction/t/screenplay/data/tei/with-colon-inside-description.tei.xml

+<?xml version="1.0" encoding="UTF-8"?>
+<tei:text xmlns:tei="http://www.tei-c.org/ns/1.0" xmlns:sp="http://web-cpan.berlios.de/modules/XML-Grammar-Screenplay/screenplay-xml-0.2/">
+  <tei:body>
+    <tei:div type="act" xml:id="index">
+      <tei:head>ACT I</tei:head>
+      <tei:div type="scene" xml:id="top">
+        <tei:head>top</tei:head>
+        <tei:div type="scene" xml:id="david_and_goliath">
+          <tei:head>david_and_goliath</tei:head>
+          <tei:stage>
+            <tei:p>
+            David and Goliath are standing by each other.
+            </tei:p>
+        </tei:stage>
+          <tei:sp><tei:speaker>David</tei:speaker>
+            <tei:p>
+                I will kill you.
+            </tei:p>
+        </tei:sp>
+          <tei:sp><tei:speaker>Goliath</tei:speaker>
+            <tei:p>
+                no way, you little idiot!
+            </tei:p>
+        </tei:sp>
+          <tei:sp><tei:speaker>David</tei:speaker>
+            <tei:p>
+                yes way!
+            </tei:p>
+            <tei:p>
+                In the name of Allah, the merciful, I will show you the power 
+                of my sling.
+            </tei:p>
+            <tei:p>
+                I shall sling you and bing you till infinity.
+            </tei:p>
+        </tei:sp>
+          <tei:stage>
+            <tei:p>
+                David takes his sling.
+            </tei:p>
+            <tei:p>
+                He looks around: there's no one there except Goliath and him.
+            </tei:p>
+            <tei:p>
+                David opens the book "Slings: The Missing Manual".
+            </tei:p>
+        </tei:stage>
+          <tei:sp><tei:speaker>Goliath</tei:speaker>
+        <tei:p>
+            I'm still waiting.
+        </tei:p>
+    </tei:sp>
+          <tei:sp><tei:speaker>David</tei:speaker>
+        <tei:p>
+            so you are.
+        </tei:p>
+    </tei:sp>
+          <tei:stage>
+        <tei:p>
+            David puts a stone in his sling and shoots Goliath. He hits.
+        </tei:p>
+    </tei:stage>
+        </tei:div>
+      </tei:div>
+    </tei:div>
+  </tei:body>
+</tei:text>

File perl/modules/XML-Grammar-Fiction/t/screenplay/data/tei/with-comments.tei.xml

+<?xml version="1.0" encoding="UTF-8"?>
+<tei:text xmlns:tei="http://www.tei-c.org/ns/1.0" xmlns:sp="http://web-cpan.berlios.de/modules/XML-Grammar-Screenplay/screenplay-xml-0.2/">
+  <tei:body>
+    <tei:div type="act" xml:id="index">
+      <tei:head>ACT I</tei:head>
+      <tei:div type="scene" xml:id="top">
+        <tei:head>top</tei:head>
+        <tei:div type="scene" xml:id="david_and_goliath">
+          <tei:head>david_and_goliath</tei:head>
+          <tei:sp><tei:speaker>David</tei:speaker>
+            <tei:p>
+                I will kill you.
+            </tei:p>
+        </tei:sp>
+          <tei:sp><tei:speaker>Goliath</tei:speaker>
+            <tei:p>
+                no way, you little idiot!
+            </tei:p>
+        </tei:sp>
+          <tei:sp><tei:speaker>David</tei:speaker>
+            <tei:p>
+                yes way!
+            </tei:p>
+        </tei:sp>
+        </tei:div>
+      </tei:div>
+    </tei:div>
+  </tei:body>
+</tei:text>

File perl/modules/XML-Grammar-Fiction/t/screenplay/data/tei/with-description.tei.xml

+<?xml version="1.0" encoding="UTF-8"?>
+<tei:text xmlns:tei="http://www.tei-c.org/ns/1.0" xmlns:sp="http://web-cpan.berlios.de/modules/XML-Grammar-Screenplay/screenplay-xml-0.2/">
+  <tei:body>
+    <tei:div type="act" xml:id="index">
+      <tei:head>ACT I</tei:head>
+      <tei:div type="scene" xml:id="top">
+        <tei:head>top</tei:head>
+        <tei:div type="scene" xml:id="david_and_goliath">
+          <tei:head>david_and_goliath</tei:head>
+          <tei:stage>
+            <tei:p>
+            David and Goliath are standing by each other.
+            </tei:p>
+        </tei:stage>
+          <tei:sp><tei:speaker>David</tei:speaker>
+            <tei:p>
+                I will kill you.
+            </tei:p>
+        </tei:sp>
+          <tei:sp><tei:speaker>Goliath</tei:speaker>
+            <tei:p>
+                no way, you little idiot!
+            </tei:p>
+        </tei:sp>
+          <tei:sp><tei:speaker>David</tei:speaker>
+            <tei:p>
+                yes way!
+            </tei:p>
+            <tei:p>
+                In the name of Allah, the merciful, I will show you the power 
+                of my sling.
+            </tei:p>
+            <tei:p>
+                I shall sling you and bing you till infinity.
+            </tei:p>
+        </tei:sp>
+          <tei:stage>
+            <tei:p>
+                David takes his sling.
+            </tei:p>
+        </tei:stage>
+          <tei:sp><tei:speaker>Goliath</tei:speaker>
+        <tei:p>
+            I'm still waiting.
+        </tei:p>
+    </tei:sp>
+          <tei:sp><tei:speaker>David</tei:speaker>
+        <tei:p>
+            so you are.
+        </tei:p>
+    </tei:sp>
+          <tei:stage>
+        <tei:p>
+            David puts a stone in his sling and shoots Goliath. He hits.
+        </tei:p>
+    </tei:stage>
+        </tei:div>
+      </tei:div>
+    </tei:div>
+  </tei:body>
+</tei:text>

File perl/modules/XML-Grammar-Fiction/t/screenplay/data/tei/with-dialogue.tei.xml

+<?xml version="1.0" encoding="UTF-8"?>
+<tei:text xmlns:tei="http://www.tei-c.org/ns/1.0" xmlns:sp="http://web-cpan.berlios.de/modules/XML-Grammar-Screenplay/screenplay-xml-0.2/">
+  <tei:body>
+    <tei:div type="act" xml:id="index">
+      <tei:head>ACT I</tei:head>
+      <tei:div type="scene" xml:id="top">
+        <tei:head>top</tei:head>
+        <tei:div type="scene" xml:id="david_and_goliath">
+          <tei:head>david_and_goliath</tei:head>
+          <tei:sp><tei:speaker>David</tei:speaker>
+            <tei:p>
+                I will kill you.
+            </tei:p>
+        </tei:sp>
+          <tei:sp><tei:speaker>Goliath</tei:speaker>
+            <tei:p>
+                no way, you little idiot!
+            </tei:p>
+        </tei:sp>
+          <tei:sp><tei:speaker>David</tei:speaker>
+            <tei:p>
+                yes way!
+            </tei:p>
+        </tei:sp>
+        </tei:div>
+      </tei:div>
+    </tei:div>
+  </tei:body>
+</tei:text>

File perl/modules/XML-Grammar-Fiction/t/screenplay/data/tei/with-entities.tei.xml

+<?xml version="1.0" encoding="UTF-8"?>
+<tei:text xmlns:tei="http://www.tei-c.org/ns/1.0" xmlns:sp="http://web-cpan.berlios.de/modules/XML-Grammar-Screenplay/screenplay-xml-0.2/">
+  <tei:body>
+    <tei:div type="act" xml:id="index">
+      <tei:head>ACT I</tei:head>
+      <tei:div type="scene" xml:id="top">
+        <tei:head>top</tei:head>
+        <tei:div type="scene" xml:id="david_and_goliath">
+          <tei:head>david_and_goliath</tei:head>
+          <tei:stage>
+            <tei:p>
+            David &amp; Goliath &lt;are&gt; standing by each other.
+        </tei:p>
+        <tei:p>
+            David is a red-head. "Hello"
+        </tei:p>
+        <tei:p>
+            Goliath is very tall.
+        </tei:p>
+        </tei:stage>
+          <tei:sp><tei:speaker>David</tei:speaker>
+            <tei:p>
+                I will kill you.
+            </tei:p>
+        </tei:sp>
+          <tei:sp><tei:speaker>Goliath</tei:speaker>
+            <tei:p>
+                no way, you little idiot!
+            </tei:p>
+        </tei:sp>
+          <tei:sp><tei:speaker>David</tei:speaker>
+            <tei:p>
+                yes way!
+            </tei:p>
+            <tei:p>
+                In the name of Allah, the merciful, I will show you the power 
+                of my sling.
+            </tei:p>
+            <tei:p>
+                I shall sling you and bing you till infinity.
+            </tei:p>
+        </tei:sp>
+          <tei:stage>
+            <tei:p>
+                David takes his sling.
+            </tei:p>
+        </tei:stage>
+          <tei:sp><tei:speaker>Goliath</tei:speaker>
+        <tei:p>
+            I'm still waiting.
+        </tei:p>
+    </tei:sp>
+          <tei:sp><tei:speaker>David</tei:speaker>
+        <tei:p>
+            so you are.
+        </tei:p>
+    </tei:sp>
+          <tei:stage>
+        <tei:p>
+            David puts a stone in his sling and shoots Goliath. He hits.
+        </tei:p>
+    </tei:stage>
+        </tei:div>
+      </tei:div>
+    </tei:div>
+  </tei:body>
+</tei:text>

File perl/modules/XML-Grammar-Fiction/t/screenplay/data/tei/with-i-element-inside-paragraphs.tei.xml

+<?xml version="1.0" encoding="UTF-8"?>
+<tei:text xmlns:tei="http://www.tei-c.org/ns/1.0" xmlns:sp="http://web-cpan.berlios.de/modules/XML-Grammar-Screenplay/screenplay-xml-0.2/">
+  <tei:body>
+    <tei:div type="act" xml:id="index">
+      <tei:head>ACT I</tei:head>
+      <tei:div type="scene" xml:id="top">
+        <tei:head>top</tei:head>
+        <tei:div type="scene" xml:id="david_and_goliath">
+          <tei:head>david_and_goliath</tei:head>
+          <tei:stage>
+            <tei:p>
+                David and 
+                <tei:ref target="http://en.wikipedia.org/wiki/Goliath">Goliath</tei:ref> 
+                are standing by each other.
+            </tei:p>
+        </tei:stage>
+          <tei:sp><tei:speaker>David</tei:speaker>
+            <tei:p>
+                I will kill you.
+            </tei:p>
+        </tei:sp>
+          <tei:sp><tei:speaker>Goliath</tei:speaker>
+            <tei:p>
+                no way, you little idiot!
+            </tei:p>
+        </tei:sp>
+          <tei:sp><tei:speaker>David</tei:speaker>
+            <tei:p>
+                yes way!
+            </tei:p>
+            <tei:p>
+                In the name of <tei:ref target="http://real-allah.tld/">Allah, the <tei:hi rend="italic">merciful</tei:hi>, real merciful</tei:ref>, I will show you the power 
+                of my sling.
+            </tei:p>
+            <tei:p>
+                I shall sling you and bing you till infinity.
+            </tei:p>
+        </tei:sp>
+          <tei:stage>
+            <tei:p>
+                David takes his sling.
+            </tei:p>
+        </tei:stage>
+          <tei:sp><tei:speaker>Goliath</tei:speaker>
+        <tei:p>
+            I'm still <tei:ref target="http://wait.tld/">waiting</tei:ref>.
+        </tei:p>
+    </tei:sp>
+          <tei:sp><tei:speaker>David</tei:speaker>
+        <tei:p>
+            so you are.
+        </tei:p>
+    </tei:sp>
+          <tei:stage>
+        <tei:p>
+            David puts a stone in his sling and shoots Goliath. He hits.
+        </tei:p>
+    </tei:stage>
+        </tei:div>
+      </tei:div>
+    </tei:div>
+  </tei:body>
+</tei:text>

File perl/modules/XML-Grammar-Fiction/t/screenplay/data/tei/with-internal-description-at-start-of-line.tei.xml

+<?xml version="1.0" encoding="UTF-8"?>
+<tei:text xmlns:tei="http://www.tei-c.org/ns/1.0" xmlns:sp="http://web-cpan.berlios.de/modules/XML-Grammar-Screenplay/screenplay-xml-0.2/">
+  <tei:body>
+    <tei:div type="act" xml:id="index">
+      <tei:head>ACT I</tei:head>
+      <tei:div type="scene" xml:id="top">
+        <tei:head>top</tei:head>
+        <tei:div type="scene" xml:id="david_and_goliath">
+          <tei:head>david_and_goliath</tei:head>
+          <tei:stage>
+            <tei:p>
+                David and 
+                <tei:ref target="http://en.wikipedia.org/wiki/Goliath">Goliath</tei:ref> 
+                are standing by each other.
+            </tei:p>
+        </tei:stage>
+          <tei:sp><tei:speaker>David</tei:speaker>
+            <tei:p>
+                I will kill you.
+            </tei:p>
+        </tei:sp>
+          <tei:sp><tei:speaker>Goliath</tei:speaker>
+            <tei:p>
+                no way, you little idiot!
+            </tei:p>
+        </tei:sp>
+          <tei:sp><tei:speaker>David</tei:speaker>
+            <tei:p>
+                yes way!
+            </tei:p>
+            <tei:p>
+                In the name of <tei:ref target="http://real-allah.tld/">Allah, the <tei:hi rend="bold">merciful</tei:hi>, real merciful</tei:ref>, I will show you the 
+                <tei:stage>[sarcastically]</tei:stage> power 
+                of my sling.
+            </tei:p>
+            <tei:p>
+                I shall sling you and bing you till infinity.
+            </tei:p>
+        </tei:sp>
+          <tei:stage>
+            <tei:p>
+                David takes his sling.
+            </tei:p>
+        </tei:stage>
+          <tei:sp><tei:speaker>Goliath</tei:speaker>
+        <tei:p>
+            I'm still <tei:ref target="http://wait.tld/">waiting</tei:ref>.
+        </tei:p>
+    </tei:sp>
+          <tei:sp><tei:speaker>David</tei:speaker>
+        <tei:p>
+            so you are.
+        </tei:p>
+    </tei:sp>
+          <tei:stage>
+        <tei:p>
+            David puts a stone in his sling and shoots Goliath. He hits.
+        </tei:p>
+    </tei:stage>
+          <tei:sp><tei:speaker>David</tei:speaker>
+        <tei:p>
+            as is written in the wikipedia <tei:stage>[See <tei:ref target="http://wiki.tld/">the Wiki site</tei:ref>
+                for more information]</tei:stage>, you are now dead,
+            having been shot with my sling.
+        </tei:p>
+    </tei:sp>
+        </tei:div>
+      </tei:div>
+    </tei:div>
+  </tei:body>
+</tei:text>

File perl/modules/XML-Grammar-Fiction/t/screenplay/data/tei/with-internal-description.tei.xml

+<?xml version="1.0" encoding="UTF-8"?>
+<tei:text xmlns:tei="http://www.tei-c.org/ns/1.0" xmlns:sp="http://web-cpan.berlios.de/modules/XML-Grammar-Screenplay/screenplay-xml-0.2/">
+  <tei:body>
+    <tei:div type="act" xml:id="index">
+      <tei:head>ACT I</tei:head>
+      <tei:div type="scene" xml:id="top">
+        <tei:head>top</tei:head>
+        <tei:div type="scene" xml:id="david_and_goliath">
+          <tei:head>david_and_goliath</tei:head>
+          <tei:stage>
+            <tei:p>
+                David and 
+                <tei:ref target="http://en.wikipedia.org/wiki/Goliath">Goliath</tei:ref> 
+                are standing by each other.
+            </tei:p>
+        </tei:stage>
+          <tei:sp><tei:speaker>David</tei:speaker>
+            <tei:p>
+                I will kill you.
+            </tei:p>
+        </tei:sp>
+          <tei:sp><tei:speaker>Goliath</tei:speaker>
+            <tei:p>
+                no way, you little idiot!
+            </tei:p>
+        </tei:sp>
+          <tei:sp><tei:speaker>David</tei:speaker>
+            <tei:p>
+                yes way!
+            </tei:p>
+            <tei:p>
+                In the name of <tei:ref target="http://real-allah.tld/">Allah, the <tei:hi rend="bold">merciful</tei:hi>, real merciful</tei:ref>, I will show you the 
+                <tei:stage>[sarcastically]</tei:stage> power 
+                of my sling.
+            </tei:p>
+            <tei:p>
+                I shall sling you and bing you till infinity.
+            </tei:p>
+        </tei:sp>
+          <tei:stage>
+            <tei:p>
+                David takes his sling.
+            </tei:p>
+        </tei:stage>
+          <tei:sp><tei:speaker>Goliath</tei:speaker>
+        <tei:p>
+            I'm still <tei:ref target="http://wait.tld/">waiting</tei:ref>.
+        </tei:p>
+    </tei:sp>
+          <tei:sp><tei:speaker>David</tei:speaker>
+        <tei:p>
+            so you are.
+        </tei:p>
+    </tei:sp>
+          <tei:stage>
+        <tei:p>
+            David puts a stone in his sling and shoots Goliath. He hits.
+        </tei:p>
+    </tei:stage>
+          <tei:sp><tei:speaker>David</tei:speaker>
+        <tei:p>
+            as is written in the wikipedia <tei:stage>[See <tei:ref target="http://wiki.tld/">the Wiki site</tei:ref>
+                for more information]</tei:stage>, you are now dead,
+            having been shot with my sling.
+        </tei:p>
+    </tei:sp>
+        </tei:div>
+      </tei:div>
+    </tei:div>
+  </tei:body>
+</tei:text>

File perl/modules/XML-Grammar-Fiction/t/screenplay/data/tei/with-multi-line-comments.tei.xml

+<?xml version="1.0" encoding="UTF-8"?>
+<tei:text xmlns:tei="http://www.tei-c.org/ns/1.0" xmlns:sp="http://web-cpan.berlios.de/modules/XML-Grammar-Screenplay/screenplay-xml-0.2/">
+  <tei:body>
+    <tei:div type="act" xml:id="index">
+      <tei:head>ACT I</tei:head>
+      <tei:div type="scene" xml:id="top">
+        <tei:head>top</tei:head>
+        <tei:div type="scene" xml:id="david_and_goliath">
+          <tei:head>david_and_goliath</tei:head>
+          <tei:sp><tei:speaker>David</tei:speaker>
+            <tei:p>
+                I will kill you.
+            </tei:p>
+        </tei:sp>
+          <tei:sp><tei:speaker>Goliath</tei:speaker>
+            <tei:p>
+                no way, you little idiot!
+            </tei:p>
+        </tei:sp>
+          <tei:sp><tei:speaker>David</tei:speaker>
+            <tei:p>
+                yes way!
+            </tei:p>
+        </tei:sp>
+        </tei:div>
+      </tei:div>
+    </tei:div>
+  </tei:body>
+</tei:text>

File perl/modules/XML-Grammar-Fiction/t/screenplay/data/tei/with-multi-para-desc.tei.xml

+<?xml version="1.0" encoding="UTF-8"?>
+<tei:text xmlns:tei="http://www.tei-c.org/ns/1.0" xmlns:sp="http://web-cpan.berlios.de/modules/XML-Grammar-Screenplay/screenplay-xml-0.2/">
+  <tei:body>
+    <tei:div type="act" xml:id="index">
+      <tei:head>ACT I</tei:head>
+      <tei:div type="scene" xml:id="top">
+        <tei:head>top</tei:head>
+        <tei:div type="scene" xml:id="david_and_goliath">
+          <tei:head>david_and_goliath</tei:head>
+          <tei:stage>
+            <tei:p>
+            David and Goliath are standing by each other.
+        </tei:p>
+        <tei:p>
+            David is a red-head.
+        </tei:p>
+        <tei:p>
+            Goliath is very tall.
+        </tei:p>
+        </tei:stage>
+          <tei:sp><tei:speaker>David</tei:speaker>
+            <tei:p>
+                I will kill you.
+            </tei:p>
+        </tei:sp>
+          <tei:sp><tei:speaker>Goliath</tei:speaker>
+            <tei:p>
+                no way, you little idiot!
+            </tei:p>
+        </tei:sp>
+          <tei:sp><tei:speaker>David</tei:speaker>
+            <tei:p>
+                yes way!
+            </tei:p>
+            <tei:p>
+                In the name of Allah, the merciful, I will show you the power 
+                of my sling.
+            </tei:p>
+            <tei:p>
+                I shall sling you and bing you till infinity.
+            </tei:p>
+        </tei:sp>
+          <tei:stage>
+            <tei:p>
+                David takes his sling.
+            </tei:p>
+        </tei:stage>
+          <tei:sp><tei:speaker>Goliath</tei:speaker>
+        <tei:p>
+            I'm still waiting.
+        </tei:p>
+    </tei:sp>
+          <tei:sp><tei:speaker>David</tei:speaker>
+        <tei:p>
+            so you are.
+        </tei:p>
+    </tei:sp>
+          <tei:stage>
+        <tei:p>
+            David puts a stone in his sling and shoots Goliath. He hits.
+        </tei:p>
+    </tei:stage>
+        </tei:div>
+      </tei:div>
+    </tei:div>
+  </tei:body>
+</tei:text>

File perl/modules/XML-Grammar-Fiction/t/screenplay/data/tei/with-numeric-entities.tei.xml

+<?xml version="1.0" encoding="UTF-8"?>
+<tei:text xmlns:tei="http://www.tei-c.org/ns/1.0" xmlns:sp="http://web-cpan.berlios.de/modules/XML-Grammar-Screenplay/screenplay-xml-0.2/">
+  <tei:body>
+    <tei:div type="act" xml:id="index">
+      <tei:head>ACT I</tei:head>
+      <tei:div type="scene" xml:id="top">
+        <tei:head>top</tei:head>
+        <tei:div type="scene" xml:id="david_and_goliath">
+          <tei:head>david_and_goliath</tei:head>
+          <tei:stage>
+            <tei:p>
+            David &amp; Goliath &lt;are&gt; standing by each other.
+        </tei:p>
+        <tei:p>
+            David is a red-head. "Hello"[ Something in square brackets. ]
+        </tei:p>
+        <tei:p>
+            Goliath is very tall.
+        </tei:p>
+        </tei:stage>
+          <tei:sp><tei:speaker>David</tei:speaker>
+            <tei:p>
+                I will kill you.
+            </tei:p>
+        </tei:sp>
+          <tei:sp><tei:speaker>Goliath</tei:speaker>
+            <tei:p>
+                no way, you little idiot!
+            </tei:p>
+        </tei:sp>
+          <tei:sp><tei:speaker>David</tei:speaker>
+            <tei:p>
+                yes way!
+            </tei:p>
+            <tei:p>
+                In the name of Allah, the merciful, I will show you the power 
+                of my sling.
+            </tei:p>
+            <tei:p>
+                I shall sling you and bing you till infinity.
+            </tei:p>
+        </tei:sp>
+          <tei:stage>
+            <tei:p>
+                David takes his sling.
+            </tei:p>
+        </tei:stage>
+          <tei:sp><tei:speaker>Goliath</tei:speaker>
+        <tei:p>
+            I'm still waiting.
+        </tei:p>
+    </tei:sp>
+          <tei:sp><tei:speaker>David</tei:speaker>
+        <tei:p>
+            so you are.
+        </tei:p>
+    </tei:sp>
+          <tei:stage>
+        <tei:p>
+            David puts a stone in his sling and shoots Goliath. He hits.
+        </tei:p>
+    </tei:stage>
+        </tei:div>
+      </tei:div>
+    </tei:div>
+  </tei:body>
+</tei:text>

File perl/modules/XML-Grammar-Fiction/t/screenplay/data/tei/with-tags-inside-paragraphs.tei.xml

+<?xml version="1.0" encoding="UTF-8"?>
+<tei:text xmlns:tei="http://www.tei-c.org/ns/1.0" xmlns:sp="http://web-cpan.berlios.de/modules/XML-Grammar-Screenplay/screenplay-xml-0.2/">
+  <tei:body>
+    <tei:div type="act" xml:id="index">
+      <tei:head>ACT I</tei:head>
+      <tei:div type="scene" xml:id="top">
+        <tei:head>top</tei:head>
+        <tei:div type="scene" xml:id="david_and_goliath">
+          <tei:head>david_and_goliath</tei:head>
+          <tei:stage>
+            <tei:p>
+                David and 
+                <tei:ref target="http://en.wikipedia.org/wiki/Goliath">Goliath</tei:ref> 
+                are standing by each other.
+            </tei:p>
+        </tei:stage>
+          <tei:sp><tei:speaker>David</tei:speaker>
+            <tei:p>
+                I will kill you.
+            </tei:p>
+        </tei:sp>
+          <tei:sp><tei:speaker>Goliath</tei:speaker>
+            <tei:p>
+                no way, you little idiot!
+            </tei:p>
+        </tei:sp>
+          <tei:sp><tei:speaker>David</tei:speaker>
+            <tei:p>
+                yes way!
+            </tei:p>
+            <tei:p>
+                In the name of <tei:ref target="http://real-allah.tld/">Allah, the <tei:hi rend="bold">merciful</tei:hi>, real merciful</tei:ref>, I will show you the power 
+                of my sling.
+            </tei:p>
+            <tei:p>
+                I shall sling you and bing you till infinity.
+            </tei:p>
+        </tei:sp>
+          <tei:stage>
+            <tei:p>
+                David takes his sling.
+            </tei:p>
+        </tei:stage>
+          <tei:sp><tei:speaker>Goliath</tei:speaker>
+        <tei:p>
+            I'm still <tei:ref target="http://wait.tld/">waiting</tei:ref>.
+        </tei:p>
+    </tei:sp>
+          <tei:sp><tei:speaker>David</tei:speaker>
+        <tei:p>
+            so you are.
+        </tei:p>
+    </tei:sp>
+          <tei:stage>
+        <tei:p>
+            David puts a stone in his sling and shoots Goliath. He hits.
+        </tei:p>
+    </tei:stage>
+        </tei:div>
+      </tei:div>
+    </tei:div>
+  </tei:body>
+</tei:text>

File perl/modules/XML-Grammar-Fiction/t/screenplay/data/xml/dialogue-with-several-paragraphs.xml

 <?xml version='1.0' encoding='utf-8'?>
-<!DOCTYPE document SYSTEM "screenplay-xml.dtd">
 <document xmlns="http://web-cpan.berlios.de/modules/XML-Grammar-Screenplay/screenplay-xml-0.2/">
     <head>
     </head>

File perl/modules/XML-Grammar-Fiction/t/screenplay/data/xml/nested-s.xml

 <?xml version='1.0' encoding='utf-8'?>
-<!DOCTYPE document SYSTEM "screenplay-xml.dtd">
 <document xmlns="http://web-cpan.berlios.de/modules/XML-Grammar-Screenplay/screenplay-xml-0.2/">
     <head>
     </head>

File perl/modules/XML-Grammar-Fiction/t/screenplay/data/xml/scenes-with-titles.xml

 <?xml version='1.0' encoding='utf-8'?>
-<!DOCTYPE document SYSTEM "screenplay-xml.dtd">
 <document xmlns="http://web-cpan.berlios.de/modules/XML-Grammar-Screenplay/screenplay-xml-0.2/">
     <head>
     </head>

File perl/modules/XML-Grammar-Fiction/t/screenplay/data/xml/two-nested-s.xml

 <?xml version='1.0' encoding='utf-8'?>
-<!DOCTYPE document SYSTEM "screenplay-xml.dtd">
 <document xmlns="http://web-cpan.berlios.de/modules/XML-Grammar-Screenplay/screenplay-xml-0.2/">
     <head>
     </head>

File perl/modules/XML-Grammar-Fiction/t/screenplay/data/xml/with-brs.xml

 <?xml version='1.0' encoding='utf-8'?>
-<!DOCTYPE document SYSTEM "screenplay-xml.dtd">
 <document xmlns="http://web-cpan.berlios.de/modules/XML-Grammar-Screenplay/screenplay-xml-0.2/">
     <head>
     </head>

File perl/modules/XML-Grammar-Fiction/t/screenplay/data/xml/with-colon-inside-description.xml

 <?xml version='1.0' encoding='utf-8'?>
-<!DOCTYPE document SYSTEM "screenplay-xml.dtd">
 <document xmlns="http://web-cpan.berlios.de/modules/XML-Grammar-Screenplay/screenplay-xml-0.2/">
     <head>
     </head>

File perl/modules/XML-Grammar-Fiction/t/screenplay/data/xml/with-comments.xml

 <?xml version='1.0' encoding='utf-8'?>
-<!DOCTYPE document SYSTEM "screenplay-xml.dtd">
 <document xmlns="http://web-cpan.berlios.de/modules/XML-Grammar-Screenplay/screenplay-xml-0.2/">
     <head>
     </head>

File perl/modules/XML-Grammar-Fiction/t/screenplay/data/xml/with-description.xml

 <?xml version='1.0' encoding='utf-8'?>
-<!DOCTYPE document SYSTEM "screenplay-xml.dtd">
 <document xmlns="http://web-cpan.berlios.de/modules/XML-Grammar-Screenplay/screenplay-xml-0.2/">
     <head>
     </head>

File perl/modules/XML-Grammar-Fiction/t/screenplay/data/xml/with-dialogue.xml

 <?xml version='1.0' encoding='utf-8'?>
-<!DOCTYPE document SYSTEM "screenplay-xml.dtd">
 <document xmlns="http://web-cpan.berlios.de/modules/XML-Grammar-Screenplay/screenplay-xml-0.2/">
     <head>
     </head>

File perl/modules/XML-Grammar-Fiction/t/screenplay/data/xml/with-entities.xml

 <?xml version='1.0' encoding='utf-8'?>
-<!DOCTYPE document SYSTEM "screenplay-xml.dtd">
 <document xmlns="http://web-cpan.berlios.de/modules/XML-Grammar-Screenplay/screenplay-xml-0.2/">
     <head>
     </head>

File perl/modules/XML-Grammar-Fiction/t/screenplay/data/xml/with-i-element-inside-paragraphs.xml

 <?xml version='1.0' encoding='utf-8'?>
-<!DOCTYPE document SYSTEM "screenplay-xml.dtd">
 <document xmlns="http://web-cpan.berlios.de/modules/XML-Grammar-Screenplay/screenplay-xml-0.2/">
     <head>
     </head>

File perl/modules/XML-Grammar-Fiction/t/screenplay/data/xml/with-internal-description-at-start-of-line.xml

 <?xml version='1.0' encoding='utf-8'?>
-<!DOCTYPE document SYSTEM "screenplay-xml.dtd">
 <document xmlns="http://web-cpan.berlios.de/modules/XML-Grammar-Screenplay/screenplay-xml-0.2/">
     <head>
     </head>

File perl/modules/XML-Grammar-Fiction/t/screenplay/data/xml/with-internal-description.xml

 <?xml version='1.0' encoding='utf-8'?>
-<!DOCTYPE document SYSTEM "screenplay-xml.dtd">
 <document xmlns="http://web-cpan.berlios.de/modules/XML-Grammar-Screenplay/screenplay-xml-0.2/">
     <head>
     </head>

File perl/modules/XML-Grammar-Fiction/t/screenplay/data/xml/with-multi-line-comments.xml

 <?xml version='1.0' encoding='utf-8'?>
-<!DOCTYPE document SYSTEM "screenplay-xml.dtd">
 <document xmlns="http://web-cpan.berlios.de/modules/XML-Grammar-Screenplay/screenplay-xml-0.2/">
     <head>
     </head>

File perl/modules/XML-Grammar-Fiction/t/screenplay/data/xml/with-multi-para-desc.xml

 <?xml version='1.0' encoding='utf-8'?>
-<!DOCTYPE document SYSTEM "screenplay-xml.dtd">
 <document xmlns="http://web-cpan.berlios.de/modules/XML-Grammar-Screenplay/screenplay-xml-0.2/">
     <head>
     </head>

File perl/modules/XML-Grammar-Fiction/t/screenplay/data/xml/with-numeric-entities.xml

 <?xml version='1.0' encoding='utf-8'?>
-<!DOCTYPE document SYSTEM "screenplay-xml.dtd">
 <document xmlns="http://web-cpan.berlios.de/modules/XML-Grammar-Screenplay/screenplay-xml-0.2/">
     <head>
     </head>

File perl/modules/XML-Grammar-Fiction/t/screenplay/data/xml/with-tags-inside-paragraphs.xml

 <?xml version='1.0' encoding='utf-8'?>
-<!DOCTYPE document SYSTEM "screenplay-xml.dtd">
 <document xmlns="http://web-cpan.berlios.de/modules/XML-Grammar-Screenplay/screenplay-xml-0.2/">
     <head>
     </head>

File perl/modules/XML-Grammar-Fiction/t/screenplay/to-tei.t

+#!/usr/bin/perl
+
+use strict;
+use warnings;
+
+use Test::More tests => 17;
+
+use Test::XML;
+
+use File::Spec;
+
+use XML::LibXML;
+
+use XML::Grammar::Screenplay::ToTEI;
+
+# TEST:$num_texts=17
+my @tests = (qw(
+    dialogue-with-several-paragraphs
+    nested-s
+    scenes-with-titles
+    two-nested-s
+    with-brs
+    with-colon-inside-description
+    with-comments
+    with-description
+    with-dialogue
+    with-entities
+    with-i-element-inside-paragraphs
+    with-internal-description-at-start-of-line
+    with-internal-description
+    with-multi-line-comments
+    with-multi-para-desc
+    with-numeric-entities
+    with-tags-inside-paragraphs
+    ));
+
+sub load_xml
+{
+    my $path = shift;
+
+    open my $in, "<", $path;
+    my $contents;
+    {
+        local $/;
+        $contents = <$in>;
+    }
+    close($in);
+    return $contents;
+}
+
+my $converter = XML::Grammar::Screenplay::ToTEI->new({
+        data_dir => File::Spec->catdir(File::Spec->curdir(), "extradata"),
+    });
+
+foreach my $fn (@tests)
+{
+    my $tei_text = $converter->translate_to_tei(
+        {
+            source => { file => "t/screenplay/data/xml/$fn.xml", },
+            output => "string",
+        }
+    );
+
+    # TEST*$num_texts
+    is_xml ($tei_text, load_xml("t/screenplay/data/tei/$fn.tei.xml"),
+        "Output of the TEI \"$fn\"",
+    );
+}
+
+1;
+