#!/usr/bin/perl # 文字コードUTF-8で保存してください。 # 漫画インデックス作成スクリプト # 実行するとカレントディレクトリ・サブディレクトリ以下のファイルを走査し、 # 各ディレクトリのzip、pdfのインデックスページ(index.html)を作成します。 use strict; use warnings; use utf8; use IO::File (); use IO::Dir (); use File::Spec (); use File::Find (); use Encode (); use URI::Escape (); use Cwd (); sub html_escape($); sub url_escape($); sub create_index($$$); sub gen_index($$$$$); # 入出力やファイル名で使用する文字コードを指定してください。 my $enc = "CP932"; binmode(STDOUT, ":encoding($enc)"); binmode(STDERR, ":encoding($enc)"); create_index("漫画一覧", ".", $enc); exit(0); # 指定のディレクトリ以下を走査し、 # サブディレクトリに対しては再帰呼び出しを行いつつ、 # ディレクトリ内のファイル(zip, pdfのみ)、サブディレクトリのindex.htmlを作成します。 sub create_index($$$){ my $title = shift(); my $dir = shift(); my $enc = shift(); STDERR->printf("%s:%s\n", $title, Encode::decode($enc, $dir)); my @subdirs = (); my @files = (); my $dh = IO::Dir->new($dir); while(my $entry = $dh->read()){ if($entry =~ /^\./o){ next; } my $path = File::Spec->catdir($dir, $entry); if(-d $path){ push(@subdirs, $entry); next; } #STDERR->printf("\t%s\n", Encode::decode($enc, $path)); next if ($path !~ /\.(?:zip|pdf)$/io); push(@files, $entry); } my $indexfile = File::Spec->catfile($dir, "index.html"); gen_index($title, $indexfile, $enc, \@subdirs, \@files); foreach my $subdir(@subdirs){ my $subtitle = Encode::decode($enc, $subdir); create_index($subtitle, File::Spec->catfile($dir, $subdir), $enc); } return; } # 与えられたファイル一覧、サブディレクトリ一覧の情報から # インデックスページ(index.html)を生成します。 sub gen_index($$$$$){ my $title = shift(); my $path = shift(); my $enc = shift(); my $dirList = shift(); my $fileList = shift(); my $fh = IO::File->new(">$path"); binmode($fh, ":encoding(UTF-8)"); $fh->print(<<HEADER); <html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>$title</title> </head> <body> <ul> HEADER map{ my $path = $_; my $name = $path; $fh->printf( qq(<li><a href="%s/">%s</a></li>\n), html_escape(join("/", map{url_escape($_)}split(/\//o, $path))), html_escape($name), ); }sort(map{ Encode::decode($enc, $_); }@$dirList); map{ my $path = $_; my $name; $path =~ /([^\/]*)\.(?:zip|pdf)$/o; $name = $1; $fh->printf( qq(<li><a href="%s">%s</a></li>\n), html_escape(join("/", map{url_escape($_)}split(/\//o, $path))), html_escape($name), ); }sort(map{ Encode::decode($enc, $_); }@$fileList); $fh->print(<<FOOTER); </ul> </body> </html> FOOTER $fh->close(); } # HTMLエスケープを行います。 sub html_escape($){ my $str = shift(); $str =~ s/&/&/go; $str =~ s/"/"/go; #" $str =~ s/>/>/go; $str =~ s/</</go; return $str; } # URLエスケープを行います。 sub url_escape($){ my $str = shift(); #$str =~ s/%/%25/go; #$str =~ s/ /%20/go; return URI::Escape::uri_escape_utf8($str); }