jqueryFileTree.plを作ってみた

2008年12月31日
| コメント(0) | トラックバック(0) jqueryFileTree.plを作ってみた

PHPやRubyのソースを見ながら、試行錯誤で作ってみた。
Perlということでplにしたけど、実際にはMENTAディレクトリ内での実行のため、拡張子はcgiに変更した。


久しぶりにモジュールを使わずに一から作ったらなかなか大変だった。
古いソースを引っ張り出して基本的な変換(アンエスケープ)をしたり、ファイルやディレクトリの一覧を得るのに、readdirを使ったり。
調べないと全然覚えてない。

しかし、セキュリティ的に微妙な気がする…。
とりあえず、「.」から始まるファイルやディレクトリは見せないようにはした。


さりげなく使っているけど、最近覚えたData::Dumperの技。

use Data::Dumper;sub p { print Data::Dumper::Dumper(shift) }

こうすることで、デバッグするときは

p(\@args);

というふうに簡単に出力することができる。
便利だね。

jqueryFileTree.pl

#!/usr/bin/perl
 
# jQuery File Tree Perl Connector
# Version 0.01
# http://nqou.net
# 31 Dec 2008
# Output a list of files for jQuery File Tree
 
use strict;
use warnings;
use utf8;
# use Data::Dumper;sub p { print Data::Dumper::Dumper(shift) }
 
print "Content-type: text/html;\n\n";
 
my @args = <>;
# p(\@args);
my %params = (map { split /=/ } @args);
# p(\%params);
foreach my $value (values %params) {
    uri_unescape(\$value);
}
# p(\%params);
 
my $target = $params{dir} || './';# 省略時は現在のディレクトリ(元々の仕様は最上位ディレクトリ)
die "Error!" if $target =~ /\.\./;# さかのぼり禁止
die "Error!" unless -d $target;# ディレクトリ以外禁止
 
our @files;
search_dir($target);
 
# p(\@files);
 
print qq{<ul class="jqueryFileTree" style="display: none;">};
 
foreach my $file (@files) {
    if (-d $file) {
        my ($dir) = $file =~ m!/([^/]*?)$!o;
        print qq{<li class="directory collapsed"><a href="#" rel="$file/">$dir</a></li>};
    } elsif (-f _) {
        my ($ext) = $file =~ /([^\.]+)$/o;
        my ($filename) = $file =~ m!/([^/]*?)$!o;
        print qq{<li class="file ext_${ext}"><a href="#" rel="$file">$filename</a></li>};
    } else {
        print "Error!";
    }
}
print qq{</ul>};
 
# ディレクトリを走査
sub search_dir {
    my $dir = shift;
    my @f;
    opendir my $dh, $dir or die "can not open `$dir`: $!";
    foreach my $file (sort {$a cmp $b} readdir $dh) {
        next if $file =~ /^\./o;
        my $path = qq{$dir$file};
        if (-f $path) {
            push @f, $path 
        } elsif (-d _) {
            push @files, $path;
        }
    }
    closedir $dh;
    push @files, @f;# ディレクトリ、ファイルの順にする
}
 
# アンエスケープ
sub uri_unescape {
    my $str = shift;
    $$str =~ s/%([0-9a-fA-F]{2})/pack("H2", $1)/eg;
}

トラックバック(0)

このブログ記事に対するトラックバックURL:

コメントする

Google検索

Last.fm

このブログ記事について

このページは、のぶりんが2008年12月31日 01:08に書いたブログ記事です。

ひとつ前のブログ記事は「後置型のifとMENTAとjQueryFileTree、そしてPHP」です。

次のブログ記事は「Module::Setupを試してみる」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

Creative Commons License
このブログのライセンスは クリエイティブ・コモンズライセンス.
Powered by Movable Type