#!/usr/bin/perl
#
# epppt.pl - PowerPoint 用 HTML作成スクリプト
#
    $MAINTAINER  = 'Morikawa Yasuhiro <morikawa@ep.sci.hokudai.ac.jp>';
    $UPDATE      = '2004/03/22';
    $VERSION     = '1.4';
    $URL         =
    'http://www.ep.sci.hokudai.ac.jp/~morikawa/perl/epppt/SIGEN_PUB.htm';
#
# ・ 概要
#
#    PowerPoint から作成した PNG(などの) 画像群を見やすい
#    スライド形式, およびサムネイル形式の HTML を作成するスクリプト
#
# ・ 使用法
#
#    以下のような書式の, 画像ファイルとその題目を記述したファイルが必要
#    (ファイル名は menu.txt とする)
#
#    ---------------------------------------------------
#        001:はじめに
#        002:目次
#        003:背景
#             :
#    ---------------------------------------------------
#
# ・ バグ
#
#    ・ 今の所見当たらず
#
# ・ History
#
#    - 1.4  2004/03/22
#           menu.txt の書式が間違っている場合にエラーを吐くように修正.
#
#    - 1.3  2004/02/09
#           menu.txt のサンプルを出力できるように変更.
#           オプションの変更.
#
#    - 1.2  2004/02/09
#           各出力ファイルの末尾に, 「This page is generated with
#           epppt ...」 のようなメッセージを出力するようにした.
#

##################################################
#####                                        #####
##                 初期設定                    ###
#####                                        #####
##################################################
#
# 日本語処理のため, jcode を組み込む.
require 'jcode.pl'
    || die "jcode.pl is not found.\n".
           "(If your OS is Debian GNU/Linux, you must install \"libjcode-perl\")\n";

# オプション処理のため, getopts を組み込む.
require 'getopts.pl'
    || die "getopts.pl is not found.\n";

# 設定ファイル名
$CONFIG_FILE = 'Config.epppt';

##################################################
#####                                        #####
##                 引数識別                    ###
#####                                        #####
##################################################

# c のみ引数をとる.
&Getopts('c:vVxrRmM');

# 引数が無い場合はヘルプ表示
unless ($opt_x || $opt_c || $opt_v || $opt_V ||
	          $opt_r || $opt_R || $opt_m || $opt_M) {
    &Help;
    exit 1;
}
# 引数が v や V の場合にはバージョン情報だけ表示
if ($opt_v || $opt_V) {
    &PrintVersion;
    exit 1;
}
# 引数が r や R の場合には README.TXT をコピーしたものを出力
if ($opt_r || $opt_R) {
    &PrintReadme;
    exit 1;
}
# 引数が m や M の場合には menu.txt のテンプレートを出力
if ($opt_m || $opt_M) {
    &PrintMenuTxt("menu.txt");
    exit 1;
}
# c オプションの場合は $CONFIG_FILE 変更
if ($opt_c) {
    $CONFIG_FILE = $opt_c;
}

sub Help() {
    print STDOUT <<EOF;
  epppt.pl:
    USAGE:
      epppt.pl [-vVrRmM] [-x] [-c configfile]

    OPTION:
      -v, -V        : バージョンナンバーを表示
      -r, -R        : README.TXT を表示
      -m, -M        : menu.txt テンプレートを出力
      -c configfile : 設定ファイルを明示して実行
      -x            : 実行 (設定ファイルは $CONFIG_FILE)

EOF
    &PrintVersion;
}
sub PrintVersion() {
    print STDOUT <<EOF;
  epppt Version $VERSION, Last Update: $UPDATE.
  $MAINTAINER All Right Reserved.

EOF
}

sub PrintMenuTxt() {
    local($menu_txt) = @_;
    print STDOUT "何ページ分の $menu_txt を出力しますか? [30]: ";
    $pagenum = <STDIN>;
    # 例外処理
    $pagenum = "30" unless ($pagenum =~ /^\d+$/);
    # 既にファイルがある場合は, 別ファイルを出力
    local($i) = 0;
    while (-f $menu_txt) {
	$i++;
	$menu_txt = "$menu_txt"."."."$i";
    }
    # ファイルオープン & 値の出力
    print STDOUT "Creating $menu_txt ...";
    open(MENUTXT, "> $menu_txt")
	|| die "$menu_txt に書き込むことが出来ませんでした. /n";
    local($j) = 1;
    for (1..${pagenum}) {
	local($outnum) = sprintf "%03d:\n", $j;
	print MENUTXT "$outnum";
	$j++;
    }
    close(MENUTXT);
    print STDOUT "done\n";
}

##################################################
#####                                        #####
##             設定ファイル確認                ###
#####                                        #####
##################################################

unless (-f $CONFIG_FILE) {
    print STDOUT "設定ファイルである $CONFIG_FILE が見当たりません.\n".
	         "  1. epppt デフォルトの設定で処理をするなら \"y\",\n".
		 "  2. 処理を中断するなら                     \"n\",\n".
		 "  3. $CONFIG_FILE テンプレートを出力するなら\"m\"\n".
		 "を入力してください [y/n/M]: ";
    $ans = <STDIN>;

    unless ($ans =~ /^[yY].*$/ || $ans =~ /^[nN].*$/) {
	print STDOUT "Creating $CONFIG_FILE ...";
	&OutputConfig($CONFIG_FILE, $VERSION, $UPDATE, $MAINTAINER);
	print STDOUT "done\n";
	exit 0;
    }
    if ($ans =~ /^[nN].*$/) {
	die "処理を中断しました.\n";
    }
}


##################################################
#####                                        #####
##             デフォルト設定値                ###
#####                                        #####
##################################################

##############################
###  ロケーション
##
# 情報ファイル
$infofile = "./menu.txt";

# タイトルファイル
$titlefile = "./title.txt";

# インデックスファイル
$indexfile = "index.html";

# メニューファイル
$menufile = "menu.html";

# サムネイルファイル名
$thumbnail_file = "thumbnail.html";

# 生成した HTML ファイル置場ディレクトリ
$htmldir = "html";

# スライド画像ファイル置場ディレクトリ
$slidedir = "slide";

# サムネイル画像ファイル置場ディレクトリ
$thumbdir = "thumbnail";


##############################
###  文字コード
##
# 出力されるファイルの日本語文字コード
# "jis", "euc", "sjis" のどれかを選択
$jpcode = "euc";

##############################
###  スタイル設定
##
## スタイルの設定
# 0: スタイル無し, 1: スタイルあり
$style_mode = "0";
    # テキストの色
$style_textcolor       = '#999900';
    # 背景色
$style_bgcolor         = '#FFFFCC';
    # 始めのリンク色
$style_linkcolor       = '#666600';
    # 既に参照した後のリンク色
$style_visitedcolor    = '#666633';
    # マウスを上に乗せた時のリンク色
$style_hovercolor      = 'orange';
    # リンクの... none: 下線無し, underline: 下線あり,
    #             blink: 点滅, overline:上線,
    #             line-through: 打ち消し線
$style_link_underline  = 'none';
    # リンクの... normal: 普通, bold: 太字
$style_link_fontweight = 'bold';

# 前後のページへのリンクに用いる文字列
$previouslink = '[前頁]';
$nextlink     = '[後頁]';

# 各ページのリンクの上下に付けるリンク
$upperlink = '▲Parent Dirctory';
$upperurl  = '';
$lowerlink = 'ppt ファイル▼';
$lowerurl  = '';

# 出力される各ページの末尾に付加されるメッセージを指定
#   - acktext を空にすると, メッセージそのものが出力されない
#   - acklink が指定されている場合ふたつのコロン "::" で
#     囲まれた部分は acklink へのリンクに変換
#   - $VERSION で epppt.pl のバージョンが出力される
#   - $URL で epppt.pl の置き場所の URL が出力される
$acktext = "This page is generated with ::epppt:: Version $VERSION";
$acklink = "$URL";

##############################
###  サムネイル
##
# 0: サムネイル無し, 1: サムネイルあり
$thumbnail_mode    = "0";
    # サムネイルへのリンクのメッセージ
$thumbnail_link    = "サムネイル表示";
    # サムネイルの列の数
$thumbnail_col_num = "3";


##############################
###  管理者／開発者用
##
# デバッグフラグ
$debug="0";



##################################################
#####                                        #####
###       ユーザ設定ファイル読み込み           ###
#####                                        #####
##################################################

# ユーザの設定ファイルが読み込める場合はそれを読み込む
if (-r $CONFIG_FILE) {
    require "$CONFIG_FILE";
}


##################################################
#####                                        #####
##                例外処理                     ###
#####                                        #####
##################################################

# 文字コードの例外処理
unless ($jpcode eq 'euc' || $jpcode eq 'sjis' || $jpcode eq 'jis') {
    print STDOUT "Modify \$jpcode from $jpcode to euc" if ($debug);
    $jpcode = 'euc';
}

##################################################
#####                                        #####
##             プログラム本体                  ###
#####                                        #####
##################################################


##################################################
## タイトルファイルからタイトル取得
##################################################

$title = &TitleGet($titlefile, $jpcode, $debug);

##################################################
## slide, thumbnail ディレクトリ内の
## 画像ファイル名をリネーム
##################################################

&ImageRename($slidedir, $debug);
&ImageRename($thumbdir, $debug) if ($thumbnail_mode);


##################################################
## slide, thumbnail ディレクトリ内から
## 画像ファイルのタイプを取り出す
##################################################

$imgtype = &GetImageType($slidedir, $debug);
$imgtype_thumb = &GetImageType($thumbdir, $debug) if ($thumbnail_mode);


#
# 情報ファイルから, ナンバーとサブジェクトを取り出す.
#
print STDOUT "Get Slide Informations from $infofile ..." unless ($debug);
open(INFOFILE, "$infofile") || die "$infofile が見つかりませんでした. \n";
while (<INFOFILE>) {
    # 例外処理
    unless ($_ =~ /^(\d){3}:.*$/) {
	die "$infofile の各行の始めは 001:.., 002:.. となっている必要があります.\n"
    }
    chomp;
    # 文字コード変換
    &jcode'convert(*_, "$jpcode");
    push(@info, $_);
}
close(INFOFILE);
print STDOUT "done\n" unless ($debug);

#print STDOUT "@info \n";


#
# ナンバーとサブジェクトを分離しておく.
# (配列の要素の位置は同じであるため, 両者を整合することは可能)
#
foreach $key (@info){
    @info_parts = split(/:/, $key, 2);
    $info_hash{"$info_parts[0]"} = "$info_parts[1]";
    push(@number, $info_parts[0]);
    push(@subject, $info_parts[1]);
}

#print STDOUT "@number \n";
#print STDOUT "@subject \n";
#print "$info_hash{$number[1]}\n";

#
# 文字コードを jpcode 用から meta タグに書き込む用に変換.
#
$metajp = &JpcodeToMeta($jpcode, $debug);

#
# スタイルとして書き出す文字列
#
$style_out = &StyleMake($style_mode, $style_textcolor, $style_bgcolor,
			$style_linkcolor, $style_visitedcolor,
			$style_hovercolor, $style_link_underline,
			$style_link_fontweight, $debug);

#
# インデックスの作成
#

&MakeIndex($title, $style_out, $metajp, $indexfile, $debug);


#
# メニューの作成
#    - グローバル変数の @number と %info_hash を内部で利用
#      (渡したかったけど, 渡せなかったのでサボる)

&MakeMenu($title, $style_out, $jpcode, $metajp,
	  $upperlink, $upperurl, $lowerlink, $lowerurl,
	  $thumnail_mode, $thumbnail_file, $thumbnail_link,
	  $menufile, $debug);

#
# 各 HTML の作成
#    - グローバル変数の @number と %info_hash を内部で利用
#      (渡したかったけど, 渡せなかったのでサボる)

&MakeHtml($title, $style_out, $previouslink, $nextlink, $imgtype,
	  $acktext, $acklink, $jpcode, $metajp, $debug);

#
# サムネイルの作成
#    - グローバル変数の @number と %info_hash を内部で利用
#      (渡したかったけど, 渡せなかったのでサボる)

&MakeThumbnail($title, $style_out, $jpcode, $metajp, $htmldir,
	       $thumnail_mode, $thumbnail_file, $thumbdir,
	       $thumbnail_link, $thumbnail_col_num,
	       $imgtype_thumb, $acktext, $acklink, $debug);

#
# 終了
#
&EndMessage($debug);


##################################################
#####                                        #####
##             サブルーチン群                  ###
#####                                        #####
##################################################

sub OutputConfig() {
    local($configfile, $version, $update, $maintainer) = @_;
    open(CONFIGFILE, "> $configfile")
	|| die "$configfile に書き込むことが出来ませんでした. /n";
    print CONFIGFILE <<EOF;
#####   $configfile for epppt    #####
##
#  This is Template File for epppt ver $version
#
#  (C) Copyright by $maintainer
#  $update.  All rights reserved.
#
EOF

    print CONFIGFILE <<'EOF';
##############################
###  ロケーション
##
# 情報ファイル
$infofile = "./menu.txt";

# タイトルファイル
$titlefile = "./title.txt";

# インデックスファイル
$indexfile = "index.html";

# メニューファイル
$menufile = "menu.html";

# サムネイルファイル名
$thumbnail_file = "thumbnail.html";

# 生成した HTML ファイル置場ディレクトリ
$htmldir = "html";

# スライド画像ファイル置場ディレクトリ
$slidedir = "slide";

# サムネイル画像ファイル置場ディレクトリ
$thumbdir = "thumbnail";


##############################
###  文字コード
##
# 出力されるファイルの日本語文字コード
# "jis", "euc", "sjis" のどれかを選択
$jpcode = "euc";

##############################
###  スタイル設定
##
## スタイルの設定
# 0: スタイル無し, 1: スタイルあり
$style_mode = "1";
    # テキストの色
$style_textcolor       = '#999900';
    # 背景色
$style_bgcolor         = '#FFFFCC';
    # 始めのリンク色
$style_linkcolor       = '#666600';
    # 既に参照した後のリンク色
$style_visitedcolor    = '#666633';
    # マウスを上に乗せた時のリンク色
$style_hovercolor      = 'orange';
    # リンクの... none: 下線無し, underline: 下線あり,
    #             blink: 点滅, overline:上線,
    #             line-through: 打ち消し線
$style_link_underline  = 'none';
    # リンクの... normal: 普通, bold: 太字
$style_link_fontweight = 'bold';

# 前後のページへのリンクに用いる文字列
$previouslink = '[前頁]';
$nextlink     = '[後頁]';

# 各ページのリンクの上下に付けるリンク
$upperlink = '▲Parent Dirctory';
$upperurl  = '';
$lowerlink = 'ppt ファイル▼';
$lowerurl  = '';

# 出力される各ページの末尾に付加されるメッセージを指定
#   - acktext を空にすると, メッセージそのものが出力されない
#   - acklink が指定されている場合ふたつのコロン "::" で
#     囲まれた部分は acklink へのリンクに変換
#   - $VERSION で epppt.pl のバージョンが出力される
#   - $URL で epppt.pl の置き場所の URL が出力される
$acktext = "This page is generated with ::epppt:: Version $VERSION";
$acklink = "$URL";


##############################
###  サムネイル
##
# 0: サムネイル無し, 1: サムネイルあり
$thumbnail_mode    = "1";
    # サムネイルへのリンクのメッセージ
$thumbnail_link    = "サムネイル表示";
    # サムネイルの列の数
$thumbnail_col_num = "3";


##############################
###  管理者／開発者用
##
# デバッグフラグ
$debug="0";



EOF

    print CONFIGFILE <<EOF;
######################################################################
# 呼び出し元からみて require '${configfile}' が 1 を返すようにする.
# そうでなければファイルが見つかっていないことが判定される.
1;
EOF

    close(CONFIGFILE);
}


# タイトルファイルからタイトルを取り出す
#
# 引数
#	$titlefile	タイトルが書き込まれているファイル
#
# 返却値
#	ファイル内の一行目を, 改行を取り除いて返す
#
sub TitleGet() {
    local($titlefile, $jpcode, $debug) = @_;
    local($title);
    print STDOUT "Get Title form $titlefile ...";
    open(TITLEFILE, "$titlefile")
	|| die "$titlefile が見つかりませんでした. \n".
	    "$titlefile に1行でタイトルを書き込んで下さい. \n";
    while (<TITLEFILE>) {
	chomp;
	# 文字コード変換
	&jcode'convert(*_, "$jpcode");
	push(@title_lists, $_);
    }
    # 一行目だけを取り出す.
    $title = $title_lists[0];
    close(TITLEFILE);
    # デバッグメッセージ
    print STDOUT "TitleGet: \$title = $title\n" if ($debug);
    # 値の返却
    print STDOUT "done.\n";
    return $title;
}

#
# ディレクトリ内の1つ目のファイルの画像タイプを取り出す
#
# 引数
#	$dir		ディレクトリ
#
# 返却値
#	ディレクトリ内の1つ目のファイルの拡張子を返す

sub GetImageType() {
    local($dir, $debug) = @_;
    print STDOUT "Get ImageType from $dir ..." unless ($debug);
    # ディレクトリオープン
    opendir(DIR, "${dir}")
	|| die "${dir} ディレクトリが存在しません. \n";
    local(@imgfiles) = grep(!/^\.\.?$/, readdir(DIR));
    closedir(DIR);
    # ディレクトリ内に画像があるかチェック
    unless ($imgfiles[0]) {
	die "$dir ディレクトリ内にファイルが存在しません. \n";
    }
    # 一つ目のファイルだけを見る. (面倒いから)
    local($sampleimg) = $imgfiles[0];
    local(@imgname_parts) = split(/\./, $sampleimg);
    local($imgtype) = $imgname_parts[$#imgname_parts];

    # デバッグ用出力
    print STDOUT "GetImageType: In $dir, ImageType is $imgtype.\n" if ($debug);
    print STDOUT "done.\n" unless ($debug);

    return $imgtype;
}

#
# 文字コードを jpcode 用から meta タグに書き込む用に変換するサブルーチン
#
sub JpcodeToMeta($jpcode, $debug) {
    print STDOUT "Recognize Japanese Code is $jpcode ..." unless ($debug);
    local($jpcode, $debug) = @_;
    local($metajp, %meta_jpcode_list);
    %meta_jpcode_list = (
			 'euc',		'euc-jp',
			 'sjis',	'Shift_JIS',
			 'jis',		'iso-2022-jp',
			);
    $metajp = $meta_jpcode_list{"$jpcode"};
    # デバッグ用出力
    print STDOUT "JpcodeToMeta: \$jpcode = $jpcode => \$metajp = $metajp\n" if ($debug);
    print STDOUT "done.\n" unless ($debug);
    return $metajp;
}

#
# スタイル整形サブルーチン
#
# 引数
#	$mode		0: スタイル無し, 1: スタイルあり
#	$textcolor	テキストの色
#	$bgcolor	背景色
#	$linkcolor	始めのリンク色
#	$visitedcolor	既に参照した後のリンク色
#	$hovercolor	マウスを上に乗せた時のリンク色
#	$link_underline	リンクの... none: 下線無し, underline: 下線あり,
#				    blink: 点滅, overline:上線,
#				    line-through: 打ち消し線
#	$link_fontweight リンクの... normal: 普通, bold: 太字
#
#
# 返却値
#	スタイルとして書き出す出力メッセージ
#
sub StyleMake() {
    local($mode, $textcolor, $bgcolor, $linkcolor, $visitedcolor,
	  $hovercolor, $link_underline, $link_fontweight, $debug) = @_;
    local($style_output);
    # スタイル用に書き出す文字列を出力.
    $style_output =
	'  <style type="text/css">'. "\n".
	'    <!--'. "\n".
        "      body{\n".
        "           color:$textcolor;\n".
        "           background-color:$bgcolor;\n".
        "          }\n".
        "      a:link{color:$linkcolor;}\n".
        "      a:visited{color:$visitedcolor;}\n".
        "      a:hover{color:$hovercolor;}\n".
        "      a{\n".
        "        text-decoration:$link_underline;\n".
        "        font-weight:$link_fontweight;\n".
        "      }\n".
        "    -->\n".
        "  </style>\n";

    # スタイル指定しない場合は, nul 文字を返す
    undef $style_output unless ($mode);

    # デバッグ用出力
    print STDOUT "StyleMake: \$style_output = \n $style_output\n" if ($debug);
    return $style_output;
}


#
# 各インデックスファイル作成サブルーチン
#
sub MakeIndex {
    local($title, $style_out, $metajp, $indexfile, $debug) = @_;
    print STDOUT "Creating Index File ..." unless ($debug);
    open(INDEXFILE, "> $indexfile")
	|| die "$indexfile に書き込むことが出来ませんでした. /n";
    #
    # ヘッダの書き出し
    #
    print INDEXFILE <<EOF;
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=${metajp}">
  <title>$title</title>
$style_out
</head>

<frameset cols="20%,80%">
<frame src="./${menufile}" name="menu" scrolling="yes">
<frame src="./${htmldir}/001.html" name="display" scrolling="yes">
</frameset>

</html>
EOF
    print STDOUT "done.\n" unless ($debug);
    close(INDEXFILE);
}


#
# メニューファイルの作成サブルーチン
#    - グローバル変数の @number と %info_hash を内部で利用
#      (渡したかったけど, 渡せなかったのでサボる)
#
sub MakeMenu() {
    local($title, $style_out, $jpcode, $metajp,
	  $upperlink, $upperurl, $lowerlink, $lowerurl,
	  $thumnail_mode, $thumbnail_file, $thumbnail_link,
	  $menufile, $debug) = @_;
    print STDOUT "Creating Menu File ..." unless ($debug);
    # 文字コード変換
    &jcode'convert(*upperlink, "$jpcode");
    &jcode'convert(*upperurl, "$jpcode");
    &jcode'convert(*lowerlink, "$jpcode");
    &jcode'convert(*lowerurl, "$jpcode");
    &jcode'convert(*thumbnail_link, "$jpcode");
    open(MENUFILE, "> $menufile")
	|| die "$menufile に書き込むことが出来ませんでした. /n";
    #
    # ヘッダの書き出し
    #
    print MENUFILE <<EOF;
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=${metajp}">
  <title> $title Menu</title>
$style_out
</head>
<body>

EOF
    #
    # 上に付けるリンク
    #
    if ($upperlink && $upperurl) {
	print MENUFILE <<EOF;
<small>
  <a href="${upperurl}" target="_top">${upperlink}</a>
</small>
<hr noshade size="1">

EOF
    }
    #
    # サムネイルモードへのリンク
    #
    if ($thumbnail_mode && $thumbnail_file && $thumbnail_link) {
	print MENUFILE <<EOF;
<center><small>
  <a href="${thumbnail_file}" target="display">${thumbnail_link}</a>
</small></center>
<hr noshade size="1">

EOF
    }
    #
    # 目次リンクのヘッダ部分書き出し
    #
    print MENUFILE <<EOF;
<ol><small>
EOF
    foreach $num (@number){
	print MENUFILE <<EOF;
<li><a href="./${htmldir}/${num}.html" target="display">$info_hash{$num}</a><br>

EOF
    }
    #
    # 目次部分のフッタの書き出し
    #
    print MENUFILE <<EOF;
</small></ol>

EOF
    #
    # 下に付けるリンク
    #
    if ($lowerlink && $lowerurl) {
	print MENUFILE <<EOF;
<hr noshade size="1">
<small><div align="right">
  <a href="${lowerurl}" target="_top">${lowerlink}</a>
</div></small>

EOF
    }
    #
    # フッタの書き出し
    #
    print MENUFILE <<EOF;
</body>
</html>
EOF
    close(MENUFILE);
    # デバッグ用出力
    if ($debug) {
	print STDOUT "MakeMenu:\n" ;
	foreach $num (@number){
	    print STDOUT "           ${num} : $info_hash{$num}\n";
	}
    }
    print STDOUT "done.\n" unless ($debug);
}


#
# 各 HTML ファイル作成サブルーチン
#    - グローバル変数の @number と %info_hash を内部で利用
#      (渡したかったけど, 渡せなかったのでサボる)
#
sub MakeHtml {
    local($title, $style_out, $previouslink, $nextlink, $imgtype,
	  $acktext, $acklink, $jpcode, $metajp, $debug) = @_;
    # デバッグ用メッセージヘッダ
    print STDOUT "MakeHtml:\n" if ($debug);

    # 文字コード変換
    &jcode'convert(*previouslink, "$jpcode");
    &jcode'convert(*nextlink, "$jpcode");
    #
    # ディレクトリの削除と作成
    #
    print STDOUT "Removing Old HTML Files ..." unless ($debug);
    print STDOUT "  Remove ./${htmldir}, and Mkdir ${htmldir}" if ($debug);

    system("/bin/rm -rf ./${htmldir}/") if -d "./${htmldir}";
    mkdir("${htmldir}", 0755);

    print STDOUT "done.\n". "Creating HTML Files ..." unless ($debug);

    # 現在のディレクトリの場所を取得
    local($current_dir) = `pwd`;
    chomp $current_dir;
    # ディレクトリ移動
    chdir("./${htmldir}");
    print STDOUT "  Move to $htmldir ...\n" if ($debug);

    # 要素番号として $element_num を用意
    local($element_num) = 0;


    while ($number[$element_num]) {
	local($allpage_num) = $#number + 1;
	local($previous_num) = $element_num - 1;
	local($next_num) = $element_num + 1;
	local($htmlnumber) = $number[$element_num];
	local($htmlfile) = "${htmlnumber}.html";
	#
	# ヘッダの作成
	#
	open(HTMLFILE, "> $htmlfile")
	    || die "$htmlfile に書き込むことが出来ませんでした. /n";
	print HTMLFILE <<EOF;
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=${metajp}">
  <title>$title [$info_hash{$htmlnumber}]</title>
$style_out
</head>
<body>
EOF
	#
	# 前後のページへのリンク, 現ページ/ページ総数, 小題の書き出し
	#
	print HTMLFILE <<EOF;

<hr noshade size="1">
<table width="90%">
  <tr>
    <td width="30%">
EOF
	# 最初のページと最後ページの場合はリンクを貼れないので
	# 条件分岐する.

	# 最初のページは [前頁] にリンクを貼らない
	if ($previous_num < 0) {
	    print HTMLFILE <<EOF;
      ${previouslink}
      <A HREF="./$number["$next_num"].html">${nextlink}</A>
EOF
	}
	# 最後のページは [後頁] にリンクを貼らない
	elsif ($next_num > $#number) {
	    print HTMLFILE <<EOF;
      <A HREF="./$number["$previous_num"].html">${previouslink}</A>
      ${nextlink}
EOF
	}
	# その他の頁は両方にリンク
	else {
	    print HTMLFILE <<EOF;
      <A HREF="./$number["$previous_num"].html">${previouslink}</A>
      <A HREF="./$number["$next_num"].html">${nextlink}</A>
EOF
	}


	print HTMLFILE <<EOF;
    </td>
    <td width="30%" align="center">
    $next_num / $allpage_num
    </td>
    <td align="right">
      $info_hash{$htmlnumber}
    </td>
  </tr>
</table>
<hr noshade size="1">

EOF
	#
	# 画像貼りつけ部分
	#
	print HTMLFILE <<EOF;
<img src="../${slidedir}/${htmlnumber}.${imgtype}" alt="$info_hash{$htmlnumber}">

EOF
	#
	# ページ末尾のメッセージ出力
	#
	if ($acktext) {
	    print HTMLFILE <<EOF;
<hr noshade size="1">
<div align="right">
EOF
	    local($_) = $acktext;
	    if ($acklink_out = $acklink) {
		${acklink_out} = "<b><a href=\"${acklink_out}\" target=\"_top\">";
		s/::/${acklink_out}/ || s/^/${acklink_out}/;
		${acklink_out} = "</a></b>";
		s/::/${acklink_out}/ || s/$/${acklink_out}/;
	    }
	    print HTMLFILE "$_\n";
	    print HTMLFILE ": at ", &FmtTime, "</div>\n";
	}
	#
	# フッタの作成
	#
	print HTMLFILE <<EOF;
</body>
</html>
EOF
	close(HTMLFILE);
	print STDOUT "${element_num}, " unless ($debug);
	# デバッグ用出力
	if ($debug) {
	    print STDOUT "  page: ${element_num}\n".
		         "    allpage : ${allpage_num}\n".
		         "    previous: ${previous_num}\n".
		         "    next    : ${next_num}\n".
		         "    html_num: ${htmlnumber}\n".
		         "    htmlfile: ${htmlfile}\n";
	}
	# 次のループへ
	$element_num++;
    }
    # 元のディレクトリに戻る
    chdir("$current_dir");
    print STDOUT "  Back to $current_dir.\n" if ($debug);
    print STDOUT "done.\n" unless ($debug);
    return;
}

#
# 時間出力用サブルーチン
#
sub FmtTime {
	local($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst)
	 = localtime time;
	sprintf "%4d/%02d/%02d %02d:%02d:%02d",
		$year + 1900, $mon + 1, $mday, $hour, $min, $sec;
}

#
# サムネイル作成サブルーチン
#    - グローバル変数の @number と %info_hash を内部で利用
#      (渡したかったけど, 渡せなかったのでサボる)
#
sub MakeThumbnail() {
    local($title, $style_out, $jpcode, $metajp, $htmldir,
	  $thumnail_mode, $thumbnail_file, $thumbdir,
	  $thumbnail_link, $thumbnail_col_num,
	  $imgtype_thumb, $acktext, $acklink, $debug) = @_;
    # デフォルトの列の数
    local($thumbnail_col_num_def) = "3";

    # デバッグ用メッセージ出力
    print STDOUT "MakeThumbnail: \$thumbnail_mode = $thumbnail_mode\n" if ($debug);
    # $thumnail_mode が偽 (0) ならば何もせずに終了
    return unless ($thumbnail_mode);

    # ユーザ用, デバッグ用メッセージ出力
    print STDOUT "Creating Thumbnail File ..." unless ($debug);
    if ($debug) {
	print STDOUT "  \$thumbnail_file = $thumbnail_file\n".
	             "  \$thumbdir = $thumbdir\n".
	             "  \$thumbnail_link = $thumbnail_link\n".
	             "  \$thumbnail_col_num = $thumbnail_col_num\n".
	             "  \$thumbdir = $thumbdir\n";
    }
    # 文字コード変換
    &jcode'convert(*thumnail_link, "$jpcode");
    # 例外処理
    unless ($thumbnail_col_num =~ /^\d+$/){
	print STDOUT "  Modify \$thumbnail_col_num ".
	    "from $thumbnail_col_num to $thumbnail_col_num_def.\n" if ($debug);
	$thumbnail_col_num = $thumbnail_col_num_def;
    }
    # ファイルオープン
    open(THUMBFILE, "> $thumbnail_file")
	|| die "$thumbnail_file に書き込むことが出来ませんでした. /n";
    #
    # ヘッダの書き出し
    #
    print THUMBFILE <<EOF;
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=${metajp}">
  <title> $title Thumbnail</title>
$style_out
</head>
<body>

EOF
    #
    # テーブルのヘッダ部分書き出し
    #
    print THUMBFILE <<EOF;
<table border="0" cellspacing="20" cellpadding="0" align="center">
EOF

    #
    # サムネイル部分作成
    #

    # 要素番号として $element_num を用意
    local($element_num) = 0;

    while ($number[$element_num]) {
	local($thumbnum) = $number[$element_num];
	local($amari) = $thumbnum % $thumbnail_col_num;

	#
	# テーブルの配置によって <tr> のつけたしをおこなう.
	# 左端 : 3n+1 ($amari == 1)
	# 右端 : 3n   ($amari == 0)
	if ($amari == 1) {
	    print THUMBFILE <<EOF;
  <tr align="center" valign="bottom">
EOF
	}

        print THUMBFILE <<EOF;
    <td align="center" valign="top">
      <a href="./${htmldir}/${thumbnum}.html">
        <img src="./${thumbdir}/${thumbnum}.${imgtype_thumb}" border="0" alt="$info_hash{$thumbnum}">
      </a>
      <br>
      <small>
         $info_hash{$thumbnum}
      </small>
    </td>
EOF
	if ($amari == 0) {
	    print THUMBFILE <<EOF;
  </tr>
EOF
	}
	# デバッグ用出力
	if ($debug) {
	    print STDOUT "    ${thumbdir}/${thumbnum}.${imgtype_thumb} -> ".
		           "./${htmldir}/${thumbnum}.html\n";
	}
	$element_num++;
    }

    #
    # テーブルで欠けている部分を追加
    #
    local($total) = $#number + 1 ; # 画像の数を取得
    local($total_amari) = $total % $thumbnail_col_num;
    local($total_nokori) = $thumbnail_col_num - $total_amari;
    local($i);
    # デバッグ用出力
    if ($debug) {
	print STDOUT "  \$total        = $total\n".
	             "  \$total_amari  = $total_amari\n".
	             "  \$total_nokori = $total_nokori\n";
    }
    
    for ($i = $total_nokori; $i > 0; $i--) {
	print THUMBFILE <<EOF;
    <td>&nbsp;</td>
EOF
    }
    if ($total_nokori) {
	print THUMBFILE <<EOF;
  </tr>
EOF
    }

    #
    # テーブルのフッタ部分書き出し
    #
    print THUMBFILE <<EOF;
</table>
EOF

    #
    # ページ末尾のメッセージ出力
    #
    if ($acktext) {
	print THUMBFILE <<EOF;
<hr noshade size="1">
<div align="right">
EOF
	local($_) = $acktext;
	if ($acklink_out = $acklink) {
	    ${acklink_out} = "<b><a href=\"${acklink_out}\" target=\"_top\">";
	    s/::/${acklink_out}/ || s/^/${acklink_out}/;
	    ${acklink_out} = "</a></b>";
	    s/::/${acklink_out}/ || s/$/${acklink_out}/;
	}
	print THUMBFILE "$_\n";
	print THUMBFILE ": at ", &FmtTime, "</div>\n";
    }

    #
    # フッタの書き出し
    #
    print THUMBFILE <<EOF;
</body>
</html>
EOF
    close(THUMBFILE);
    
    print STDOUT "done.\n" unless ($debug);
}



# 終了メッセージの表示 (デバッグモード時)
#
sub EndMessage() {
    local($debug) = @_;
    print STDOUT "EndMessage: Execute Successfully!!\n" if ($debug);
    print STDOUT "Complete.\n" unless ($debug);
}




##################################################
#####                                        #####
##       画像ファイル名変換サブルーチン        ###
#####       (大規模なので, 分離)             #####
##################################################

# 画像ファイルリネームサブルーチン
#
# 引数
#	$dir		移動先ディレクトリ
#	$debug		デバッグ用フラグ
#
# 返却値
#	なし
#
# ・ 概要
#
#    1.PNG, 2.PNG ～ 231.PNG といった画像ファイルを
#    001.png, 002.png ～ 231.png という風にリネームするスクリプト
#
#
sub ImageRename() {
    local($dir, $debug) = @_;
    print STDOUT "Rename image files in $dir ...";
    
    ########################################################
    ##  デフォルト設定値
    ########################################################
    
    # 桁数
    local($len) = 3;
    
    # 処理する画像ファイルの形式
    local(@treat) = ('gif', 'GIF', 'jpg', 'JPG', 'jpeg', 'JPEG',
		     'png', 'PNG', 'bmp', 'BMP', 'tif', 'TIF',
		     'tiff', 'TIFF');
    
    ########################################################

    # 現在のディレクトリの場所を取得
    local($current_dir) = `pwd`;
    chomp $current_dir;
    # ディレクトリ移動
    chdir($dir);
    print STDOUT "  Move to $dir ...\n" if ($debug);
    
    
    # カレントディレクトリ内の".", ".."を除く全てのファイルを取得
    opendir(DIR, ".");
    local(@allfiles) = grep(!/^\.\.?$/, readdir(DIR));
    closedir(DIR);
    
    ########################################################
    ##   画像ファイルでなかったり,
    ##   数字のファイル名でないものを除去
    ########################################################
    
    foreach $file (@allfiles){
	local(@file_parts) = split(/\./, $file);
	#print STDOUT "file name is $file_parts[0], expand is $file_parts[$#file_parts] \n";
	#
	#  a.gif や ab0.png といったファイル名が含まれている場合は
	#  エラーを返す
	#
	unless ($file_parts[0] =~ /^\d+$/){
	    die "このディレクトリには 123.gif のような名前でないファイルが含まれており, 処理を実行できませんでした. \n";
	}
	#
	#  @treat に含まれていない拡張子の場合はエラーを返す.
	#
	local($img_ok, $imgtype);
	undef $img_ok;
	foreach $imgtype (@treat){
	    if ($file_parts[$#file_parts] eq $imgtype){
		$img_ok = 1;
	    }
	}
	unless ($img_ok){
	    die "このディレクトリには, このスクリプトではサポートしていない画像形式のファイルが存在するため, 処理を実行できませんでした. \n";
	}
    }
    
    ######################################################
    ##  ファイル名をリネーム
    ######################################################

    local($file);
    foreach $file (@allfiles){
	local(@file_parts) = split(/\./, $file);
	local($filename) = $file_parts[0];
	local($imgtype) = $file_parts[$#file_parts];
	#
	# ファイルのナンバーを規定の桁数にする
	#
	if ($len < length($filename)){
	    # エラーマーカー
	    local($error) = 1;
	    local($whole_error) = 1;
	    warn "リネームするファイル名の長さが元々のファイル名の長さより短く設定されているため, 正常に処理されませんでした. \n";
	} else {
	    # エラーマーカーの解除
	    $error = 0;
	}
	local($new_filename) = sprintf('%.' . $len . 'd', $filename);
	
	#print STDOUT $new_filename;
	
	#
	# 拡張子を小文字にする
	#
	local($new_imgtype) = $imgtype;
	$new_imgtype =~ tr/A-Z/a-z/;
	
	#print STDOUT $new_imgtype;
	
	rename("$file", "$new_filename\.$new_imgtype");

	if ($debug) {
	    print STDOUT "    $file -> $new_filename\.$new_imgtype";
	    print STDOUT "\t \[Irregular Rename...\]" if $error == 1 ;
	    print STDOUT "\n";
	}
    }

    if ($debug) {
	if ($whole_error == 1){
	    print STDOUT "    いくつかの異常な処理が行われた可能性があります. \n";
	} else {
	    print STDOUT "    処理は正常に終了しました. \n";
	}
    }
    
    # 元のディレクトリに戻る
    chdir("$current_dir");
    print STDOUT "  Back to $current_dir.\n" if ($debug);
    print STDOUT "done.\n";
    return;
}


##################################################
#####                                        #####
##         README.TXT 出力サブルーチン         ###
#####      (内容は README.TXT のコピー)      #####
##################################################


sub PrintReadme() {
    print STDOUT <<'EOF';
☆ epppt (EPnetFaN PowerPoint 整形) セット☆

   PowerPoint ファイルを見やすい HTML 形式に変換する Perl スクリプト

■ 概要

   PowerPoint はプレゼンテーションに便利だが, それを万人に見えるような
   HTML 形式に変換するのが面倒くさい.
   (PowerPoint で「HTML形式で保存」とすると, Windows でしか見られない
    形式になって保存される)

   このスクリプトのセットを使うことで, どのプラットフォームでも
   見ることができ, そこそこ見やすい(?)HTMLファイルを作成することが出来る.


■ 梱包物

   epppt.tar.gz ファイルを展開することで以下のファイルができあがる
   はずである.

     ・ epppt.pl         … HTML フォーマットを作成するPerlスクリプト
     ・ sample           … サンプル
     ・ README.TXT       … このファイル

   (開発者用ツール)
     ・ Config_epppt_dev … 開発者用 epppt 設定ファイル
     ・ Makefile         … make 用のファイル


■ サンプル (おまけ)

   sample ディレクトリには, epppt のサンプルが置いてある.
   (このサンプルを使えるかどうかで, システム上で epppt が
    使えるかどうかのテストにもなるだろう)

   ・ title.txt	    … サンプルのタイトルファイル
   ・ menu.txt	    … サンプルのメニューファイル
   ・ slide	    … サンプルのスライド画像置き場
   ・ thumbnail	    … サンプルのサムネイル画像置き場
   ・ Makefile	    … make 用ファイル
   ・ ORG	    … 初期化用ファイル/ディレクトリ置き場
   ・ Config.epppt  … epppt のサンプル設定ファイル
   ・ epppt.ppt	    … サンプルの ppt ファイル

   □ HTML 生成

      sample に移動し, epppt コマンドを実行する

        $ cd sample
	$ perl ../epppt.pl -x

      すると, sample ディレクトリ以下に, index.html 等,
      生成された HTML 等ができるはずである.

      ブラウザで実際に見てみて欲しい

      
   □ 初期化

      生成した HTML を消去し, 初期化したい場合は,

        $ make clean

      とすると良い.


■ HTML 作成手順

   ◇ Windows で行う作業

      まず, Windows 側で ppt ファイルから画像ファイルを生成する必要がある.

      1. soi ツール 「P2H」を取得

	 ppt ファイルから画像ファイルを生成するのには soi ツールの一つ
	 である 「P2H」が便利である.
	 以下の URL からリンクを辿り, p2h.exe を取得する.

	   http://www.soi.wide.ad.jp/doc/mate/detail.html

             または

	   http://www.soi.wide.ad.jp/soibeans/

	 ちなみに, p2h.exe の実体は以下の URL にある.
	 (もちろん上記のページからリンクが貼られている)

	   http://www.soi.wide.ad.jp/pub/software/P2H/

	     または

	   http://www.soi.wide.ad.jp/soibeans/P2H/


      2. スライド画像用ディレクトリの作成

	 スライド画像を保管するディレクトリ「slide」を作成する.
	 ここには画像ファイル以外のものは置かないこと


      3. P2H でスライド用画像ファイルを生成

	 a. P2H を起動
	 b. 「File」→「Open PPT File」で目的の ppt ファイルを開く
         c. 「File」→「Save Location」で先程作成した slide ディレクトリを指定
	 d. 「Image」にチェックをつけ, 画像形式を「PNG」とする
	 e. 「Width」を 640, 「Height」を 480 にする
	      ※ 1024x768 モニタを対象にする場合はこのサイズが適当だが,
		 他のサイズにしても epppt は処理できる.
	 f. 「Export」ボタンを押して画像を出力
	 g. slide ディレクトリ以下に 1.PNG ～ **.PNG が作成されていることを確認


      3. サムネイル画像用ディレクトリの作成
	 ※ サムネイルを作成しない場合は必要ない.

	 サムネイル画像を保管するディレクトリ「thumbnail」を作成する.
	 ここには画像ファイル以外のものは置かないこと


      4. P2H でサムネイル用画像ファイルを生成
	 ※ サムネイルを作成しない場合は必要ない.

	 a. P2H を起動
	 b. 「File」→「Open PPT File」で目的の ppt ファイルを開く
         c. 「File」→「Save Location」で先程作成した
	    thumbnail ディレクトリを指定
	 d. 「Image」にチェックをつけ, 画像形式を「PNG」とする
	 e. 「Width」を 200, 「Height」を 150 にする
	      ※ 1024x768 モニタを対象にする場合はこのサイズが適当だが,
		 他のサイズにしても epppt は処理できる.
	 f. 「Export」ボタンを押して画像を出力
	 g. thumbnail ディレクトリ以下に 1.PNG ～ **.PNG
	    が作成されていることを確認


      次に ppt ファイルのタイトルファイルを作成する.

      5. ppt ファイルのタイトルを「title.txt」に書き込む.
          ※ 中身は 1行で書き込むこと
	     sample 内の title.txt を参照して欲しい
         

      次に ppt ファイルの小題一覧を作成する.

      6. ppt ファイルの中身を見ながら, 小題一覧のテキストファイル
         「menu.txt」を作成する

	 書式は

		001:<1つめのスライドの題目>
		002:<2つめのスライドの題目>
		003:<3つめのスライドの題目>
			    :

	 となる. 具体的には

		001:はじめに
		002:目次
		003:BIOSって?
		     :

	 と書き出せば良い.

	 ※ sample 内の menu.txt を参照して欲しい.

      最後に, ここまでで作成した slide, thumbnail, title.txt, menu.txt を
      Linux 環境のマシン (Web サーバでいいでしょう) にコピーする.


   ◇ Linux (Web サーバ)で行う作業

      0. epppt.pl が利用できるためには...

	 a. perl が使える
	    - 専攻 Web サーバなら必ず使える
	    - perl 5.6.1 で動作確認済

	    - ※ パスに関して ※
		 epppt.pl は Debian の環境で作成したので
		 perl のパスが /usr/bin/perl となっている.
		 他の OS の場合はパスが異なる場合があるので
		 変更すること
		 (perl のパスは which perl とすると知ることができる)

		 変更は, epppt.pl 本体の一番上の行の
		 「#!/usr/bin/perl」を書き換えればよい

	 b. jcode.pl が使える (日本語文字コード用ライブラリです)
	    - 専攻 Web サーバなら必ず使える
	    - Debian GNU/Linux 3.0 ならば, libjcode-perl パッケージを
	      インストールすることで, システムに組み込める
	    - jcode.pl の本家である http://srekcah.org/jcode/ から
	      ダウンロードし, jcode.pl にファイル名を変換して,
	      プログラムを実行する際のカレントディレクトリや,
	      /usr/lib/perl5 等に置くと良いかも

         なお, 動作確認のために sample ディレクトリが用意されている.
	 もしも下記の手順にしたがってうまく行かない場合,
	 sample 以下で動作チェックを行なって欲しい.


      1. slide, thumbnail, title.txt, menu.txt を本来の置き場所に移動

	 title.txt や menu.txt があるディレクトリにこれから epppt.pl で
	 作成する index.html が置かれる.


      2. 設定ファイル Config.epppt の生成

	 title.txt, menu.txt があるディレクトリまで移動し,
	 以下のように epppt.pl コマンドを使用する.

	    $ <epppt.plが置かれているディレクトリ>/epppt.pl -x

	 すると,

	    設定ファイルである Config.epppt が見当たりません.
	      1. epppt デフォルトの設定で処理をするなら "y",
	      2. 処理を中断するなら                     "n",
	      3. Config.epppt テンプレートを出力するなら"m"
	    を入力してください [y/n/M]:

	 と表示されるので, "m" を押して Enter キーを押す.

	 すると, Config.epppt のテンプレートが作成される.

	 ※ 旧 dcppt 利用者の皆様へ

	    ここで, "y" を押してデフォルトの設定で処理をすると
	    だいたいは以前の dcppt の動作と一緒になる.
	    Config.epppt などの設定が面倒な場合はそちらを
	    選んで欲しい.

	     + デフォルト処理の特徴
	       - サムネイル無し
	       - メニューの上下のリンク無し
	       - スタイルシートによる文字装飾無し
	       - 文字コード euc


      3. Config.epppt の設定

	 Config.epppt を emacs や jvim などの日本語表示可能な
	 エディタで開き, 編集する.

	 ・ ロケーション

	    各種ファイルやディレクトリの設定が可能であるが,
	    基本的に変更の必要は無い.
	    変更の際には, 上記で用意してきたファイルや
	    ディレクトリの名前をそれ似合わせて変更する必要が
	    あるので注意.

	 ・ 文字コード

	      # 出力されるファイルの日本語文字コード
	      # "jis", "euc", "sjis" のどれかを選択
	      $jpcode = "euc";

	    デフォルトは euc だが, Windows 環境の人などは
	    sjis でも良いのかも知れない.
	    (上記に該当するもの以外を入力した場合は
	     euc になるので注意.)


	 ・ スタイル設定

	      # 0: スタイル無し, 1: スタイルあり
	      $style_mode = "1";
	          # テキストの色
	      $style_textcolor       = '#999900';
		          :

	    文字の色や背景色等の設定が可能である.
	    各設定変数を設定して欲しい.
	    設定が面倒な場合は $style_mode を 0 にすることで,
	    装飾無しにもできる.

	      
	      # 前後のページへのリンクに用いる文字列
	      $previouslink = '[前頁]';
	      $nextlink     = '[後頁]';

	    スライドの前後のページに飛ぶ際のリンクのメッセージ
	    を設定できる.

	      $upperlink = '▲Parent Dirctory';
	      $upperurl  = '';
	      $lowerlink = 'ppt ファイル▼';
	      $lowerurl  = '';

	    左に出るメニューの上下にリンクを付けることができる.
	    $upperlink, $lowerlink で文字列の指定を,
	    $upperurl, $lowerurl が URL の指定を行なう.
	    上の $upperlink や $lowerlink は例なので,
	    変更しても構わない.
	    …が, それぞれ, どちらかでも空になっていると
	    リンクそのものができないので注意.


	 ・ サムネイル

	      # 0: サムネイル無し, 1: サムネイルあり
	      $thumbnail_mode    = "1";
	          # サムネイルへのリンクのメッセージ
	      $thumbnail_link    = "サムネイル表示";
		  # サムネイルの列の数
	      $thumbnail_col_num = "3";

	    サムネイルの設定を行なう.



      3. epppt を使用して HTML ファイルを作成

	 再度, title.txt, menu.txt があるディレクトリまで移動し,
	 以下のように epppt.pl コマンドを使用する.

	    $ <epppt.plが置かれているディレクトリ>/epppt.pl -x

	 すると, 以下のファイル群が作成されるはずである.

	  ・ index.html    … インデックスファイル
                              (frame で menu.html と ***.html を呼び出す)
	  ・ menu.html     … メニューファイル
	  ・ thumbnail.html… サムネイルファイル (作成した場合)
	  ・ html          … frame の右側に出る HTML が格納されるディレクトリ
	  ・ html/***.html
			… 001.html, 002.html といった HTML ファイルで,
			   それぞれが, pic/001.png, pic/002.png を
			   呼び出している.
	  ・ slide/***.gif [png, ...],
	     thumbnail/***.gif [png, ...]
			… 元々, soi ツールでの変換ならば
			   1.GIF, 2.GIF などとなっていたはずだが,
			   001.gif, 002.gif といったようにファイル名が
			   変更されているはずである.

   以上で必要な HTML ファイルが作成されたはずである.

EOF
}
