sourcereader.cgi

Permalink

#!/usr/bin/env perl
#utf8
# use Acme::PerlTidy;
use utf8;
use FindBin;
use lib qq{$FindBin::Bin/../../perl5/lib/perl5};
# use local::lib qq{$FindBin::Bin/../../perl5};

use Mojolicious::Lite;
use Mojo::Util qw/md5_sum/;
use Path::Class;
use Encode;
use Encode::Guess qw/euc-jp shiftjis/;
use Try::Tiny;

app->secret(md5_sum $0 );
app->log->level('error');
#app->log->level('debug')->path(qq{$0.log})->debug(app->secret);
#use Data::Dumper;
#app->helper( deepdumper => sub {
#    shift;
#    Data::Dumper->new([@_])->Indent(1)->Terse(1)->Dump;
#} );

get '/' => sub {
    my $self = shift;
    my $rel_path = $self->param('file') || $FindBin::Script;
    my $fullpath = file( $FindBin::Bin, $rel_path )->cleanup;
    $rel_path = $fullpath->relative($FindBin::Bin);
    $self->stash(
        title => 'Error!',
    );
    if ( $rel_path !~ /\.\./ and $rel_path =~ /\.(p[ml]|mt|(ps|c)gi|(cs|j)s|html?)\z/ms) {# pm,pl,mt,psgi,cgi,css,js,html,htm
        my $code = try { $fullpath->slurp } catch { undef };
        if ( $code ) {
            my $enc = guess_encoding($code);
            $enc = Encode::find_encoding('utf8') unless ref $enc;
            my $url = $self->url_for->clone;
            $url->query->param( 'file' => $rel_path );
            $url->path->trailing_slash(0);
            $self->render(
                permalink => $url->to_abs,
                template => 'index',
                title => $rel_path,
#                debug => $self->deepdumper( $self->url_for ),
                code => $enc->decode($code),
            );
        }
        else {
            $self->render( 'error' );
        }
    }
    else {
        $self->render( 'error' );
    }
};

app->start;

__DATA__
@@ index.html.ep
% layout 'main';
<p><%= link_to 'Permalink' => $permalink %></p>
<pre><code><%= $code %></code></pre>

@@ error.html.ep
% layout 'main';
<p>選択されたファイルは存在しないか表示できません。</p>

@@ layouts/main.html.ep
<!DOCTYPE html>
<html>
  <head>
    <meta charset="<%= app->renderer->encoding %>">
    <title><%= $title %> - devel.nqou.net</title>
    <link rel="stylesheet" href="http://google-code-prettify.googlecode.com/svn/trunk/src/prettify.css">
    <link rel="stylesheet" href="devel.css">
  </head>
  <body>
    <h1><%= $title %></h1>
    <%= content %>
    <script src="http://google-code-prettify.googlecode.com/svn/trunk/src/prettify.js"></script>
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5/jquery.min.js"></script>
    <script src="start.prettyPrint.js"></script>
    <script type="text/javascript">
        var _gaq = _gaq || [];
        _gaq.push(['_setAccount', 'UA-3538047-4']);
        _gaq.push(['_trackPageview']);
        (function() {
            var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
            ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
            var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
        })();
    </script>
  </body>
</html>