Fiction-XML / perl / modules / XML-Grammar-Fiction / lib / XML / Grammar / Fiction / App /

package XML::Grammar::Fiction::App::FromProto;

use strict;
use warnings;

use base 'Exporter';

our @EXPORT = (qw(run));

use Getopt::Long;

use Exception::Class;

use XML::Grammar::Fiction::FromProto;
use XML::Grammar::Fiction::FromProto::Parser::QnD;

=head1 NAME

XML::Grammar::Fiction::App::FromProto - command line app-in-a-module
to convert from a well-formed plaintext format to Fiction-XML.

=head1 VERSION

Version 0.1.4


our $VERSION = '0.1.4';


    perl -MXML::Grammar::Fiction::App::FromProto -e 'run()' -- \


=head2 run()

Call with no arguments to run the application from the commandline.


sub run
    my $output_filename;

        "output|o=s" => \$output_filename,

    if (!defined($output_filename))
        die "Output filename not specified! Use the -o|--output flag!";

    my $converter = XML::Grammar::Fiction::FromProto->new({
        parser_class => "XML::Grammar::Fiction::FromProto::Parser::QnD",

    eval {
        my $output_xml = $converter->convert({
                source => { file => shift(@ARGV), },

        open my $out, ">", $output_filename;
        binmode $out, ":utf8";
        print {$out} $output_xml;

    # Error handling.

    my $e;
    if ($e = Exception::Class->caught("XML::Grammar::Fiction::Err::Parse::TagsMismatch"))
        warn $e->error(), "\n";
        warn "Open: ", $e->opening_tag->name(), 
            " at line ", $e->opening_tag->line(), "\n"
        warn "Close: ", 
            $e->closing_tag->name(), " at line ", 
            $e->closing_tag->line(), "\n";

    elsif ($e = Exception::Class->caught("XML::Grammar::Fiction::Err::Parse::LineError"))
        warn $e->error(), "\n";
        warn "At line ", $e->line(), "\n";
    elsif ($e = Exception::Class->caught())
        if (ref($e))
            die $e;


=head1 AUTHOR

Shlomi Fish, L<>.

=head1 BUGS

Please report any bugs or feature requests to
C<bug-xml-grammar-fiction at>, or through the web interface at
I will be notified, and then you'll automatically be notified of progress on
your bug as I make changes.



Copyright 2007 Shlomi Fish, all rights reserved.

This program is released under the following license: MIT X11.


Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.