Skip to content

michal-josef-spacek/Plack-App-File-PYX

Repository files navigation

NAME
    Plack::App::File::PYX - Plack PYX directory application.

SYNOPSIS
     use Plack::App::File::PYX;

     my $obj = Plack::App::File::PYX->new(%parameters);
     my $psgi_ar = $obj->serve_path($env, $file);
     my $app = $obj->to_app;

METHODS
  "new"
     my $obj = Plack::App::File::PYX->new(%parameters);

    Constructor.

    Returns instance of object.

    *   "content_type"

        Content-Type of serialized output. There is possibility of callback
        (reference to code) with $file argument which return content type
        string.

        Default value is 'text/html'.

    *   "encoding"

        Set the file encoding for text files. Defaults to 'utf-8'.

    *   "file"

        The file path to create responses from. Optional.

        If it's set the application would ALWAYS create a response out of
        the file and there will be no security check etc. (hence fast). If
        it's not set, the application uses "root" to find the matching file.

    *   "indent"

        Set Tags::Output::* class for output serialization.

        Default value is Tags::Output::Raw.

    *   "root"

        Document root directory. Defaults to "." (current directory)

  "serve_path"
     my $psgi_ar = $obj->serve_path($env, $file);

    Process file on disk and serve it to application.

    Returns reference to array (PSGI structure).

  "to_app"
     my $app = $obj->to_app;

    Creates Plack application.

    Returns Plack::Component object.

EXAMPLE1
     use strict;
     use warnings;

     use File::Temp;
     use IO::Barf;
     use Plack::App::File::PYX;
     use Plack::Runner;

     # Temporary file with PYX.
     my $temp_pyx_file = File::Temp->new->filename;

     # PYX file.
     my $pyx = <<'END';
     (html
     (head
     (title
     -Title
     )title
     )head
     (body
     (div
     -Hello world
     )div
     )body
     )html
     END
     barf($temp_pyx_file, $pyx);

     # Run application with one PYX file.
     my $app = Plack::App::File::PYX->new('file' => $temp_pyx_file)->to_app;
     Plack::Runner->new->run($app);

     # Output:
     # HTTP::Server::PSGI: Accepting connections at http://0:5000/

     # > curl http://localhost:5000/
     # <html><head><title>Title</title></head><body><div>Hello world</div></body></html>

EXAMPLE2
     use strict;
     use warnings;

     use File::Temp;
     use IO::Barf;
     use Plack::App::File::PYX;
     use Plack::Runner;

     # Temporary file with PYX.
     my $temp_pyx_file = File::Temp->new->filename;

     # PYX file.
     my $pyx = <<'END';
     (html
     (head
     (title
     -Title
     )title
     )head
     (body
     (div
     -Hello world
     )div
     )body
     )html
     END
     barf($temp_pyx_file, $pyx);

     # Run application with one PYX file.
     my $app = Plack::App::File::PYX->new(
             'file' => $temp_pyx_file,
             'indent' => 'Tags::Output::Indent',
     )->to_app;
     Plack::Runner->new->run($app);

     # Output:
     # HTTP::Server::PSGI: Accepting connections at http://0:5000/

     # > curl http://localhost:5000/
     # <html>
     #   <head>
     #     <title>
     #       Title
     #     </title>
     #   </head>
     #   <body>
     #     <div>
     #       Hello world
     #     </div>
     #   </body>
     # </html>

EXAMPLE3
     use strict;
     use warnings;

     use File::Temp;
     use IO::Barf;
     use Plack::App::File::PYX;
     use Plack::Runner;

     # Temporary file with PYX.
     my $temp_pyx_file = File::Temp->new->filename;

     # PYX file.
     my $pyx = <<'END';
     ?xml version="1.0"
     (svg
     Axmlns http://www.w3.org/2000/svg
     (rect
     Ax 80
     Ay 60
     Awidth 250
     Aheight 250
     Arx 20
     Astyle fill:#ff0000; stroke:#000000; stroke-width:2px;
     )rect
     (rect
     Ax 140
     Ay 120
     Awidth 250
     Aheight 250
     Arx 40
     Astyle fill:#0000ff; stroke:#000000; stroke-width:2px; fill-opacity:0.7;
     )rect
     )svg
     END
     barf($temp_pyx_file, $pyx);

     # Run application with one PYX file.
     my $app = Plack::App::File::PYX->new(
             'content_type' => 'image/svg+xml',
             'file' => $temp_pyx_file,
             'indent' => 'Tags::Output::Indent',
     )->to_app;
     Plack::Runner->new->run($app);

     # Output:
     # HTTP::Server::PSGI: Accepting connections at http://0:5000/

     # > curl http://localhost:5000/
     # <?xml version="1.0"?>
     # <svg xmlns="http://www.w3.org/2000/svg">
     #   <rect x="80" y="60" width="250" height="250" rx="20" style=
     #     "fill:#ff0000; stroke:#000000; stroke-width:2px;">
     #   </rect>
     #   <rect x="140" y="120" width="250" height="250" rx="40" style=
     #     "fill:#0000ff; stroke:#000000; stroke-width:2px; fill-opacity:0.7;">
     #   </rect>
     # </svg>

EXAMPLE4
     use strict;
     use warnings;

     use File::Temp;
     use IO::Barf;
     use Plack::App::File::PYX;
     use Plack::Runner;

     # Temporary file with PYX.
     my $temp_pyx_file = File::Temp->new->filename;

     # PYX file in UTF8, prepared for iso-8859-2 output.
     my $pyx = <<'END';
     (html
     (head
     (title
     -žščřďťň
     )title
     (meta
     Acharset iso-8859-2
     )meta
     )head
     (body
     (div
     -Hello in iso-8859-2 encoding - Ahoj světe!
     )div
     )body
     )html
     END
     barf($temp_pyx_file, $pyx);

     # Run application with one PYX file.
     my $app = Plack::App::File::PYX->new(
             'encoding' => 'iso-8859-2',
             'file' => $temp_pyx_file,
             'indent' => 'Tags::Output::Indent',
     )->to_app;
     Plack::Runner->new->run($app);

     # Output:
     # HTTP::Server::PSGI: Accepting connections at http://0:5000/

     # > curl http://localhost:5000/
     # XXX in ISO-8859-2 encoding
     # <html>
     #   <head>
     #     <title>
     #       žščřďťň
     #     </title>
     #     <meta charset="iso-8859-2">
     #     </meta>
     #   </head>
     #   <body>
     #     <div>
     #       Hello in iso-8859-2 encoding - Ahoj světe!
     #     </div>
     #   </body>
     # </html>

DEPENDENCIES
    Encode, English, Error::Pure, HTTP::Date, Plack::App::File,
    Plack::Util::Accessor, PYX::SGML::Tags, Tags::Output::Raw,
    Unicode::UTF8.

REPOSITORY
    <https://github.com/michal-josef-spacek/Plack-App-File-PYX>

AUTHOR
    Michal Josef Špaček <mailto:skim@cpan.org>

    <http://skim.cz>

LICENSE AND COPYRIGHT
    © 2020 Michal Josef Špaček

    BSD 2-Clause License

VERSION
    0.02