Skip to content

Instantly share code, notes, and snippets.

@CLCL
Last active December 15, 2015 17:59
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save CLCL/5300226 to your computer and use it in GitHub Desktop.
Save CLCL/5300226 to your computer and use it in GitHub Desktop.
Mojoliciousのヘルパーっていうのはよくわからなかったんだが、つまりViewのロジックの再利用されるサブルーチンを書くものってことでいいんだよね?
#!/usr/bin/perl
# --------------------------------------------------------------------------
# Mojoliciousが持っているテンプレートエンジンEPは、テンプレート側でロジック
# が組めるので、MVCモデルで言うところのC側では、プレゼンテーション(表現って
# いう意味ね)をいじるためのコードを書かないするようにするのがよい。
#
# 例えば、ファイルマネージャ的なウェブアプリケーションを作るとして、M側から
# はファイルサイズがbyte数でしか出てこないものを、ヒューマンリーダブルにする
# ために、KB・MB・GB表記に変更するっていうのはよくやるのだけれども、 この単
# 位繰り上げ処理をCでやらずに、Vでやろうということになる。
#
# で、MojoliciousのV担当のEPでは、テンプレート内にロジックが組めるので、そこ
# に単位繰上げのコードを書いてもいいんだけど、再利用がしにくいという問題があ
# るので、最終的には、ヘルパーという仕組みを使って、再利用可能なコードとして
# 記述する。
#
# つまり、ヘルパーというのは、Vに所属する仕組み、ということになるよね。
# --------------------------------------------------------------------------
use 5.010; # Mojolicious 1.9.8以降はPerl 5.10対応
use Mojolicious::Lite;
use Mojo::Util qw(decode);
use File::Basename;
use File::Spec;
my $file_dir = app->home->rel_dir('./');
get '/' => sub {
my $self = shift;
my @filelist = glob( File::Spec->catfile( $file_dir, '*' ) );
my $files = [];
for my $filename ( @filelist ) {
my @stat = stat $filename;
push @$files, {
filename => decode('utf8', File::Basename::basename($filename) ),
size => $stat[7],
mtime => $stat[9],
};
}
$self->stash( files => $files );
} => 'index';
# Mojolicious Helpers
# ファイルサイズのバイト数を、人間が読めるように桁繰上げする
helper humanreadable_filesize => sub {
my ($self, $string) = @_;
my $size = $string;
my $unit = 'byte';
if ( $size > 1024 ) { $size /= 1024; $unit = 'KB'; };
if ( $size > 1024 ) { $size /= 1024; $unit = 'MB'; };
if ( $size > 1024 ) { $size /= 1024; $unit = 'GB'; };
$string = sprintf '%.1f %s', $size, $unit;
};
# Unix epoch時刻を、人間が読めるように整形する
helper humanreadable_datetime => sub {
my ($self, $string) = @_;
my $mtime = $string;
my ($second, $minute, $hour, $mday, $month, $year) = localtime $mtime;
$year += 1900;
$month ++;
my $datetime = sprintf '%4d-%02d-%02dT%02d:%02d:%02d',
$year, $month, $mday, $hour, $minute, $second;
$string = $datetime;
};
app->start;
__DATA__
@@ index.html.ep
<!DOCTYPE html>
<style>
table { border-collapse: collapse; }
th, td { border: 1px solid; padding: 6px; }
</style>
<table>
<thead>
<tr>
<th>filename</th><th>size</th><th>datetime</th>
</tr>
</thead>
<tbody>
% for my $item (@$files) {
<tr>
<td>
%= $item->{filename}
</td>
<td title="<%= $item->{size} %>">
%= humanreadable_filesize( $item->{size} )
</td>
<td>
<time datetime="<%= humanreadable_datetime( $item->{mtime} ) %>">
%= humanreadable_datetime( $item->{mtime} )
</time>
</td>
</tr>
% }
</tbody>
</table>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment