use utf8;
#モジュールをインポート
use Encode qw/encode decode/;
use File::Basename qw/basename dirname/;
use Archive::Zip;
use Archive::Extract;
use File::Path;
#引数1で指定したepubファイルを取得
$epubFilePath = $ARGV[0];
$epubFilePath = decode('UTF-8', $epubFilePath);
my $epubFileName = basename $epubFilePath;
###################チェック用一時epubファイルのパスを取得###################
my $epubpackage = Archive::Zip->new();
die unless $epubpackage->read($epubFilePath) == Archive::Zip::AZ_OK;
#パスリスト変数の定義
my @xhtmlfilePaths;
my @files = $epubpackage->members();
#EPUB内各XHTMLファイルへのパスを取得
foreach my $file (@files) {
push(@xhtmlfilePaths,$file->fileName) if ($file->fileName =~ /^(.*?)\.xhtml$/);
}
###################チェック用一時ファイル解凍処理###################
my $uniqueFolderPath = '/tmp/' . $epubFileName;
#同一フォルダが存在したら連番をつける処理
my $mynum = 1;
if (-d $uniqueFolderPath){
while (-d $uniqueFolderPath){
$uniqueFolderPath = ('/tmp/' . $epubFileName . '_' . $mynum);
$mynum++;
}
}
#解凍実行
my $epubArchive = Archive::Extract->new(archive => $epubFilePath,type => 'zip') or die;
$epubArchive->extract(to => $uniqueFolderPath);
###################チェック処理###################
#ログ出力用変数定義
our $finalXmlIdnameOutputLog = "";
#各xhtmlファイルを展開
foreach $myXhtmlfilePath (@xhtmlfilePaths){
&eachFileProceed($myXhtmlfilePath);
}
###################ログにタイトル部分を合成###################
if ($finalXmlIdnameOutputLog eq ""){
$finalXmlIdnameOutputLog = '##Xml Idname Check Result : ' . "\r\n" . 'OK! Not Any Irregular Xml IdName in EPUB File!';
} else {
$finalXmlIdnameOutputLog = '##Xml Idname Check Result : ' . "\r\n" . $finalXmlIdnameOutputLog;
}
###################チェック用一時ファイルの削除###################
rmtree($uniqueFolderPath);
###################ログ出力###################
my $logOutputPath = (dirname $epubFilePath) . '/EpubIdNameCheck.log';
$logOutputPath = encode('UTF-8', $logOutputPath);
open(OUT,">> $logOutputPath");
#チェックしたepubファイル名を出力
my $finalFilename = '####Checked FileName : ' . "\r\n" . $epubFileName;
$finalFilename = encode('UTF-8', $finalFilename);
print OUT $finalFilename . "\r\n\r\n";
#XMLのID名のチェック結果を出力
$finalXmlIdnameOutputLog = encode('UTF-8', $finalXmlIdnameOutputLog);
print OUT $finalXmlIdnameOutputLog . "\r\n\r\n";
close (OUT);
exit;
###################Sub###################
#各xhtmlファイルのチェック
sub eachFileProceed {
my $myXhtmlfilePath = $_[0];
#各xhtmlファイル名を取得
our $xhtmlFileName = basename $myXhtmlfilePath;
my $eachFilePath = ($uniqueFolderPath . "/" . $myXhtmlfilePath);
open(IN,"$eachFilePath");
#改行コードの統一処理
@myCHECKFILEtxts = <IN>;
$myCHECKFILEtxts = join("",@myCHECKFILEtxts);
$myCHECKFILEtxts =~ s@\x0D\x0A@\x0D@g;
$myCHECKFILEtxts =~ s@\x0A@\x0D@g;
$myCHECKFILEtxts = decode('UTF-8', $myCHECKFILEtxts);
@eachLine = split("\x0D",$myCHECKFILEtxts);
close (IN);
our $lineNumCount = 1;
#各ファイル内各行のチェック
foreach $myLine (@eachLine){
&eachLineProceed($myLine);
$lineNumCount++;
}
}
#XMLのID名のチェック
sub eachLineProceed {
my $myLine = $_[0];
while($myLine =~ /id *= *\"([^\"]*?)\"/ig) {
unless ($1 =~ /^[0-9a-zA-Z\-\_\.:]+?$/){
$matchPlace = pos($myLine);
$finalXmlIdnameOutputLog = ($finalXmlIdnameOutputLog . 'Caution! IrregularXmlIdName at ' . ' ' . 'FileName:' . $xhtmlFileName . ' ' . 'Line:' . $lineNumCount . ' ' . 'Character:' . $matchPlace . "\n")
}
}
}