NAME
    Dancer::Plugin::DirectoryView - Browse directory contents in Dancer web
    applications

VERSION
    Version 0.01

SYNOPSIS
        use Dancer::Plugin::DirectoryView;

        # Allow browsing of public/files/share
        directory_view '/files/share';
    
        # Browse /some/other/directory (located outside of public) as /files/other
        directory_view '/files/other' => { root_dir => '/some/other/directory',
                                           system_path => 1 };

        # Calling directory_view in a route handler
        get qr{/files/secret/(.*)} => sub {
            my ($path) = splat;
        
            # Check if the user has permissions to access these files
            if (...) {
                return directory_view(root_dir => '/some/secret/directory',
                                      path => $path,
                                      system_path => 1);
            }
            else {
                return send_error("Access denied!", 403);
            }
        };

DESCRIPTION
    Dancer::Plugin::DirectoryView provides an easy way to allow the users of
    your web application to browse the contents of specific directories on
    the server. It generates directory index pages to navigate through the
    directories, in a similar fashion as Apache's mod_autoindex and
    Plack::App::Directory, but in contrast to those solutions, it does not
    depend on how your application is deployed.

CONFIGURATION
    If there's just one directory that you want to make accessible, you can
    configure it in the configuration file of your application, under
    "plugins":

        plugins:
            DirectoryView:
                url: /pub/files
                root_dir: /some/directory
                show_hidden_files: 1
                system_path: 1

    If there are more directories, you need to set them up by calling the
    "directory_view" function in your app. The first parameter is a string
    that defines the URL at which the directory contents will be available,
    the second is a reference to a hash with options. Example:

        directory_view '/pub/photos' => { root_dir => '/home/mike/photos',
                                          system_path => 1 };
                                       
        directory_view '/pub/documents' => { root_dir => '/usr/share/doc',
                                             system_path => 1 };

    The available configuration options are listed below.

  layout
    If set to 1, the directory listing is displayed in the application's
    default layout (instead of the layout defined by the "template"). If set
    to a name of a file under "views/layouts", that file is used as the
    layout.

  path
    The current path to browse/display, relative to "root_dir". Required
    when "directory_view" is called in a route handler.

  root_dir
    The root directory which will be available to the users. If it's a
    relative path, it is assumed to be located under "public". It must be
    specified when "directory_view" is called in a route handler. If
    "directory_view" is called outside a route handler, then "root_dir" may
    be omitted, and it will be assumed to be the same as the base URL and
    relative to "public".

  show_hidden_files
    If set to 1, hidden files (with names starting with ".") are included in
    the directory listing.

    Default: 0

  system_path
    If set to 1, directories and files outside the "public" directory can be
    accessed. This is required if "root_dir" itself is located outside of
    "public".

    Default: 0

  template
    The template to use. It is the name of a directory containing three
    template files:

    *   "layout.tt" - The layout in which the directory listing is displayed
        (the HTML document that wraps the listing)

    *   "listing.tt" - The template for the directory listing container
        (e.g., a table header/footer)

    *   "file.tt" - The template for a single file in the listing (e.g., a
        table row)

    The plugin first looks for this directory in the application's "views"
    directory, then in its own "views" directory.

    Default: "basic"

  url
    The URL at which the root directory will be accessible.

EXAMPLES
  Directory under "public"
    In the simplest example, the root directory is located under the
    "public" directory of the application, so it's already intended to be
    world-accessible and you don't have worry about "system_path" and
    permissions. Assuming that the directory is "public/files/docs", you can
    enable it either with the following entries in the configuration file:

        plugins:
            DirectoryView:
                url: /files/docs

    or with this call in your application:

        directory_view '/files/docs';

  Directory under "public" with a different URL
    If you want to make the directory accessible, but with a different URL
    than the system path, provide both the "url" and the "root_dir" options
    in the configuration file:

        plugins:
            DirectoryView:
                url: /documents
                root_dir: files/docs

    Or, call "directory_view" like this:

        directory_view '/documents' => { root_dir => 'files/docs' };

  Directory outside "public"
    When the root directory is located outside of "public", you need to
    enter both the desired "url" and "root_dir", as well as enable the
    "system_path" option to allow access to files not within the "public"
    directory. Example configuration:

        DirectoryView:
            url: /holiday-photos
            root_dir: /home/user/photos/holidays
            system_path: 1

    Example call:

        directory_view '/holiday-photos' => { root_dir => '/home/user/photos/holidays',
                                              system_path => 1 };

  Directory outside "public" with relative path
    Using a relative path in "root_dir", you can also access directories
    above the "public" directory of your application. For example, if for
    some reason you would like to let users view your application's logs,
    you could use this configuration:

        plugins:
            DirectoryView:
                url: /logs
                root_dir: ../logs
                system_path: 1

    Or this call:

        directory_view: '/logs' => { root_dir => '../logs', system_path => 1 };

AUTHOR
    Michal Wojciechowski, "<odyniec at cpan.org>"

BUGS
    Please report any bugs or feature requests to
    "bug-dancer-plugin-directoryview at rt.cpan.org", or through the web
    interface at
    <http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Dancer-Plugin-DirectoryV
    iew>. I will be notified, and then you'll automatically be notified of
    progress on your bug as I make changes.

SUPPORT
    You can find documentation for this module with the perldoc command.

        perldoc Dancer::Plugin::DirectoryView

    You can also look for information at:

    *   RT: CPAN's request tracker

        <http://rt.cpan.org/NoAuth/Bugs.html?Dist=Dancer-Plugin-DirectoryVie
        w>

    *   AnnoCPAN: Annotated CPAN documentation

        <http://annocpan.org/dist/Dancer-Plugin-DirectoryView>

    *   CPAN Ratings

        <http://cpanratings.perl.org/d/Dancer-Plugin-DirectoryView>

    *   Search CPAN

        <http://search.cpan.org/dist/Dancer-Plugin-DirectoryView/>

ACKNOWLEDGEMENTS
    Some parts of the code were heavily inspired by Tatsuhiko Miyagawa's
    Plack::App::Directory.

    Used icons from the Oxygen Icons project
    (<http://www.oxygen-icons.org/>).

LICENSE AND COPYRIGHT
    Copyright 2011 Michal Wojciechowski.

    This program is free software; you can redistribute it and/or modify it
    under the terms of either: the GNU General Public License as published
    by the Free Software Foundation; or the Artistic License.

    See http://dev.perl.org/licenses/ for more information.

