Last active
December 15, 2015 17:59
-
-
Save CLCL/5300226 to your computer and use it in GitHub Desktop.
Mojoliciousのヘルパーっていうのはよくわからなかったんだが、つまりViewのロジックの再利用されるサブルーチンを書くものってことでいいんだよね?
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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