DVD在庫表 HTMLコンバータ

テキストで記述された DVD 在庫の情報を、HTMLに変換します。
同時に2種類のHTMLテキストを作成します。(通常,50音順)
ふりがな濁音・半濁音対応などを行ないました。
[使用法] dvdtbl.pl src.txt normai.html onidx.html


#!/usr/local/bin/perl
# DVD在庫テーブルスクリプト
# coded by Yoshiaki Tanaka
# 漢字はシフトJIS 前提
# ファイル仕様:タイトル ふりがな先頭 購入日 収録時間 コメント

$infile = ""; 
$outn = "normal.html";  # 取得日付(テキスト入力)順
$outi = "onidx.html";   # 50音順 INDEX 付き

# 50音順にソートするためのデータ
%sortidx = (
            "あ" =>  1, "い" =>  2, "う" =>  3, "え" => 4, "お" =>  5,
            "か" =>  6, "き" =>  7, "く" =>  8, "け" => 9, "こ" => 10,
            "さ" => 11, "し" => 12, "す" => 13, "せ" =>14, "そ" => 15,
            "た" => 16, "ち" => 17, "つ" => 18, "て" =>19, "と" => 20,
            "な" => 21, "に" => 22, "ぬ" => 23, "ね" =>24, "の" => 25,
            "は" => 26, "ひ" => 27, "ふ" => 28, "へ" =>29, "ほ" => 30,
            "ま" => 31, "み" => 32, "む" => 33, "め" =>34, "も" => 35,
            "や" => 36,             "ゆ" => 37,            "よ" => 38,
            "ら" => 39, "り" => 40, "る" => 41, "れ" =>42, "ろ" => 43,
            "わ" => 44,                                    "を" => 45,
            "ん" => 46,
            # 濁音、半濁音対応
            "が" =>  6, "ぎ" =>  7, "ぐ" =>  8, "げ" => 9, "ご" => 10,
            "ざ" => 11, "じ" => 12, "ず" => 13, "ぜ" =>14, "ぞ" => 15,
            "だ" => 16, "ぢ" => 17, "づ" => 18, "で" =>19, "ど" => 20,
            "ば" => 26, "び" => 27, "ぶ" => 28, "べ" =>29, "ぼ" => 30,
            "ぱ" => 26, "ぴ" => 27, "ぷ" => 28, "ぺ" =>29, "ぽ" => 30
);

$recidx = "あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん";


# 引数チェック & ファイルオープン
if ($#ARGV != 0 && $#ARGV != 2) {
    print "Usage : dvdtbl src [normalout indexout]";
    exit 1;
} else {
    $infile = $ARGV[0];
    if ($#ARGV > 0) {
        $outn = $ARGV[1];
        $outi = $ARGV[2];
    }
    $err =  open(SRC, $infile);
    $err &= open(OUTN, ">$outn");
    $err &= open(OUTI, ">$outi");

    unless ($err) {
        print "File open error.";
        exit 2;
    }
}

# header 出力
out_head( OUTN, "映画 DVD 在庫", "映画 DVD 在庫(購入順)"
    , "映画 DVD の在庫管理です。整理・確認のためと、人とお話するときに便利なので作りました。" );
out_head( OUTI, "映画 DVD 在庫", "映画 DVD 在庫(50音順)"
    , "映画 DVD の在庫管理です。整理・確認のためと、人とお話するときに便利なので作りました。" );


# 読込み
out_tblhead(OUTN);
%temp = ();
while (<SRC>) {
    s/\s*$//;
# 格納順 html 出力
    @cells = split;
    if ($#cells < 4) {
    # 未使用フィールドは - で埋める
        for ($i = $#cells+1 ; $i < 5 ; $i++) {
            $cells[$i] = "−";
        }
    }
    out_tbl( OUTN, $cells[0], $cells[2], $cells[3], $cells[4]);

# 分類してhash リストに追加
    $idx = $sortidx{ substr($cells[1],0,2) };
    if ( $idx == undef || $idx > 46 ) {
        $idx = 46;     # 50音以外
    } else {
        $idx--;
    }
    push ( @{ $temp{ $idx } }, $_);
}

out_tblfoot(OUTN);

# 分類結果表示
foreach $k (keys(%temp)) {
    print "IDX : $k \n";
    foreach $v (@{$temp{ $k }}) {
        print "    $v\n";
    }
};


# インデックス出力
print   OUTI "<A NAME=INDEX>\n";
print   OUTI "<DIV ALIGN=CENTER>";
print   OUTI "- INDEX -";
print   OUTI "<BR><TABLE WIDTH=75% BORDER=0>\n";
for ($i = 0 ; $i <= 44 ; $i+=15) {
    print   OUTI "<TR>\n";

    for ($j = $i ; $j < $i+15 ; $j++) {
        if ($temp{ $j } == undef) {
            print OUTI "<TD>", substr($recidx, $j*2, 2), "</TD>";
        } else {
            print OUTI "<TD><A HREF=\"#$j\">", substr($recidx, $j*2, 2),"</A></TD>\n";
        }
    }
    print OUTI "</TR>\n";
}

if ($temp{ 45 } == undef) {
    print OUTI "<TD>ん</TD>\n";
} else {
    print OUTI "<TD><A HREF=\"#45\">ん</A></TD>\n";
}
if ($temp{ 46 } == undef) {
    print OUTI "<TD>他</TD>\n";
} else {
    print OUTI "<TD><A HREF=\"#46\">他</A></TD>\n";
}
print OUTI "</TABLE></DIV><BR><HR>\n";

# インデックス毎に別表で出力
for ($k = 0 ; $k <= 46 ; $k++) {
    $fst = 1;

    foreach (@{$temp{ $k }}) {
        @cells = split;
        if ($#cells < 4) {
        # 未使用フィールドは - で埋める
            for ($i = $#cells+1 ; $i < 5 ; $i++) {
                $cells[$i] = "−";
            }
        }
        if ($fst) {
            print OUTI "<A NAME=$k>\n";
            if ($k != 46) {
                print OUTI "<DIV ALIGN=CENTER> −", substr($recidx, $k*2, 2),"− </DIV>";
            } else {
                print OUTI "<DIV ALIGN=CENTER> −その他− </DIV>";
            }
            out_tblhead(OUTI);
            $fst = 0;
        }
        out_tbl( OUTI, $cells[0], $cells[2], $cells[3], $cells[4]);
    }
    if ($fst == 0) {
        out_tblfoot(OUTI);
        print OUTI "<BR>\n";
    }
}

# footer 出力
out_foot( OUTN );
out_foot( OUTI );

# 後始末
close( SRC );
close( OUTN );
close( OUTI );



#########################################
#  HTML ヘッダー出力
#  0:handle, 1:http title ,2:表示するタイトル ,3:コメント
sub     out_head     {

    select( $_[0] );

    print  <<Multi_text;

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0024)http://www.google.ne.jp/ -->
<HTML><HEAD>
<META content="text/html; charset=shift_jis" http-equiv=Content-Type>
<META content=document name=resource-type>
<META content=no-cache http-equiv=pragma>
<META content="4 days" name=revisit-after>
<META content="Internet Services" name=classification>
<META content="MSHTML 5.00.2920.0" name=GENERATOR>
<TITLE>$_[1]</TITLE>
</HEAD>
<BODY aLink="#ff8000" bgColor="#000060e0" link="#ff2000" text="#ffffff" vLink="#ff0000"  >

<H2 ALIGN=CENTER>$_[2]</H2>

<DIV ALIGN=CENTER>
$_[3]
</DIV>
<BR>
<DIV ALIGN=CENTER>
<A HREF="index.html">TOP PAGEへ</A>
</DIV>

<BR><HR>

Multi_text

    select( STDOUT );
}

#########################################
#  table ヘッダー出力
#  0:handle
sub     out_tblhead     {
    select( $_[0] );

    print  <<Multi_text;

<DIV ALIGN=CENTER>
<BR><TABLE WIDTH=95% BORDER=1 BGCOLOR=#0050e0><TR>
<TD WIDTH=30%>タイトル</TD>
<TD WIDTH=15%>購入日/発売日</TD>
<TD WIDTH=10%>収録時間</TD>
<TD WIDTH=45%>コメント</TD>
</TR>

Multi_text

    select( STDOUT );
}


#########################################
#  table フッター出力
sub     out_tblfoot     {
    select( $_[0] );

    print  <<Multi_text;

</TABLE>
</DIV>
Multi_text

    select( STDOUT );
}


#########################################
#  テーブル出力
#  0:handle, 1:タイトル ,2:日付 ,3:収録時間 ,4:コメント
sub     out_tbl     {
    select( $_[0] );
    print "<TR>";
    print "<TD>$_[1]</TD>\n";
    print "<TD>$_[2]</TD>\n";
    print "<TD>$_[3]</TD>\n";
    print "<TD>$_[4]</TD>\n";
    print "</TR>\n\n";

    select( STDOUT );
}


#########################################
#  HTML フッター出力
sub     out_foot     {
    select( $_[0] );

    print  <<Multi_text;

</TABLE>
</DIV>
<BR><HR>
<DIV ALIGN=CENTER>
<A HREF="#INDEX">INDEXへ</A><BR>
<A HREF="index.html">TOP PAGEへ</A>
</DIV>

</BODY></HTML>
Multi_text

    select( STDOUT );
}

総合ホームページ Perl納戸部屋