#!/usr/bin/env perl
#
# dcreal-html.pl :
#   スライド画像はめ込み用 html ファイル, ram ファイルを作成する
# Copyright (C) GFD_Dennou_Club, 2001-.  All rights reserved.
#
#  ●Usage : dcreal-html.pl (引数無し)
#
#  ●準備するファイル, 作成されるファイル
#
#      (講演者名)
#      |-- src/           [準備] 一次製作物置場.
#      |  |
#      |  |-- dcreal.conf        (必須) dcreal-conf.pl で作成される設定ファイル
#      |  |
#      |  |-- img-web/           (必須) 講演資料から作成された画像置き場
#      |  |
#      |  |-- GFDseminar_2006_03_31_13_00.trt
#      |  |                      (必須) タイミングファイル
#      |  |
#      |  |-- GFDseminar_2006_03_31_13_00.rm
#      |  |                      (必須) RealMedia ファイル
#      |  |
#      |  `-- lecture1.html      (任意) レクチャーノート
#      |
#      `-- pub-web/       [作成] Web ブラウザから閲覧する資料置場
#
#
#== History
#
#These entries is generated by CVS automatically.
#So don't add new information manually.
#(But please adjust old log format to latest log format manually,
#if format gap between them causes).
#
#$Log: dcreal-html.pl,v $
#Revision 1.18  2006/09/26 08:43:14  morikawa
#* 左フレームのコメントの表示に関するバグを修正.
#
#Revision 1.17  2006/04/11 13:37:08  morikawa
#* pub-web/img-web 以下に, src/img-web の全ての画像のシンボリックリンク
#  を作成するのではなく, 講演に必要なものだけをシンボリックリンクするよ
#  う修正.
#
#Revision 1.16  2006/04/06 08:07:48  morikawa
#* コメント部に書かれる解説に追記.
#* 履歴情報は CVS log を用いるように修正.
#* ディレクトリ生成時にメッセージを表示するよう修正.
#* pub-web, pub-real 以下の既存の html, smil ファイルを一度綺麗に
#  削除するよう修正.
#
#
#* 2006/04/04 森川靖大    : 設定ファイルの書式変更に伴う修正
#* 2003/09/07 杉山耕一朗: 全面改訂
#* 2002/11/27 小高正嗣: 英語版対応
#* 2001/04/10 杉山耕一朗
#
######################################################################
#Jcode.pm モジュールの読み込み
use Jcode; 
use File::Basename;

#文字コード設定
$target_code = "euc"; 

# 設定ファイルの読み込み
$CONF = 'dcreal.conf'; 
while (@ARGV) {
    last unless ($ARGV[0] =~ /^-/);
    $_ = shift;
    if (/^-c/) { $CONF = shift; next; };
    die "unknown option $_";
}
require "$CONF";

#言語選択
if ($LANG) {
    $NAME = $NAME_EN; 
    $MEMBERSHIP = $MEMBERSHIP_EN; 
    $TITLE = "\"$TITLE_EN\""; 
    $PROJECT = $PROJECT_EN;
    $HOST = $HOST_EN; 
    $PLACE = "at $PLACE_EN";
    $HTML = "html.en"; 
    $TITLE_MENU1 = "About Lecture"; 
    $TITLE_MENU2 = "List of slides"; 
    $TITLE_MENU3 = "Download"; 
    $TITLE_MENU4 = "How to listen our video"; 
    $LEC_TXT = "Info of Lecturer"; 
    $PHOTO_TXT = "Photo of Lecturer"; 
    $CR_TXT = "Copyright"; 
    $PJ_TXT = "top to the $PROJECT_EN";
    $MENU_TXT = $MENU_TXT_EN;
    $VD = "video";
    $ICON1 = "[video start]"; 
    $ICON2 = "[previous]"; 
    $ICON3 = "[next]"; 
    $ICON4 = "[go to top]"; 
    if ($TOP_EN =~ /^$/){
	$TOP = ""; 
    }else{
	$TOP = $TOP_EN; 
    }
}else{
    $NAME = $NAME_JP; 
    $MEMBERSHIP = $MEMBERSHIP_JP; 
    $TITLE = "「$TITLE_JP」"; 
    $PROJECT = $PROJECT_JP;
    $HOST = $HOST_JP; 
    $PLACE = "於 $PLACE_JP";
    $HTML = "html.ja"; 
    $TITLE_MENU1 = "講演について"; 
    $TITLE_MENU2 = "スライド一覧"; 
    $TITLE_MENU3 = "ダウンロード"; 
    $TITLE_MENU4 = "講演を聞くには"; 
    $LEC_TXT = "講演者紹介"; 
    $PHOTO_TXT = "講演者近影"; 
    $CR_TXT = "著作権について"; 
    $PJ_TXT = "$PROJECT_JP top へ"; 
    $MENU_TXT = $MENU_TXT_JP;
    $VD = "講演ビデオ";
    $ICON1 = "[ビデオ開始]"; 
    $ICON2 = "[前頁]"; 
    $ICON3 = "[後頁]"; 
    $ICON4 = "[表紙へ]"; 
    if ($TOP_JP =~ /^$/){
	$TOP = ""; 
    }else{
	$TOP = $TOP_JP; 
    }
}

#格納先ディレクトリ定義
$WEBDIR = "../$WEBDIR";
$RAMDIR = "$WEBDIR/ram";
$IMGDIR_BIG = "$WEBDIR/img-web";

#Web資源格納ディレクトリ作成
unless (-d $WEBDIR) {
    print "mkdir $WEBDIR, 0777\n";
    mkdir $WEBDIR, 0777;
}
unless (-d $RAMDIR) {
    print "mkdir $RAMDIR, 0777\n";
    mkdir $RAMDIR, 0777;
}

#画像ディレクトリのリンク
unless (-d $IMGDIR_BIG) {
    print "mkdir $IMGDIR_BIG, 0777\n";
    mkdir $IMGDIR_BIG, 0777;
}

#表紙ファイルを Web 資源ディレクトリにリンク
if ($TOP !~ /^$/){
    $cmd_lnk = "cd $WEBDIR; ln -s ../$SRC/$TOP ./";
    print "$cmd_lnk\n";
    system($cmd_lnk);
}

#タイミングファイルのオープン, 必要な情報の抽出. 
$i = 0;
$e = 0; 
while ($TRT_FILES[$e]) {
    open (TIMING, "$TRT_FILES[$e]");
    $starts[$e] = $i; 
    while (<TIMING>) {
	chomp(@_);
	#開始時間, OHP 番号, OHP タイトルを別々に保存
	$_ =~ /^\s*([0-9]+:[0-9]+:[0-9]+),\s*(\d+)\s*:(.*)$/;
	$time[$i] = $1;
	$ohp_num[$i] = $2;
	($code, $nmatch) = getcode($3);
#	print "$code, $nmatch \n"; 
	$ohp_title[$i] = Jcode::convert($3, $target_code, $code); 
	$ends[$e] = $i; 
#	print "$time[$i], $ohp_num[$i], $ohp_title[$i] \n"; 
	$i++;
    }
    $e++;
    close (TIMING);
}
#print "@starts \n";
#print "@ends \n";

#ohp_num の最大値
$i = 0;
while ($ends[$i]) {
    foreach $e ($starts[$i] .. $ends[$i]) {
	$num = sprintf("%03d", $ohp_num[$e]);
	push(@tmp, $num);
    }
    $s1[$i] = shift(@tmp);  #開始番号は trt ファイルの最初
    @tmp = sort(@tmp); 
    $s2[$i] = pop(@tmp); 
#    print "$s1[$i], $s2[$i] \n";
    $i++; 
    undef @tmp;
}

#print "@RM_FILES_SLIDE \n";

# $WEBDIR 以下の 数字 3 桁.$HTML ファイルを削除
print "Cleaning in $WEBDIR/???.$HTML .. ";
opendir DIR, $WEBDIR or die "$dir:$!";
while (my $files_in_webdir = readdir DIR) {
    next if $files_in_webdir =~ /^\.{1,2}$/; # '.'や'..'も取れるので、スキップする
    if ($files_in_webdir =~ /^[0-9][0-9][0-9]\.$HTML$/) {
	unlink "$WEBDIR/$files_in_webdir";
    }
}
closedir DIR;
print " done.\n";

# $IMGDIR_BIG 以下の 数字 3 桁.$EXT ファイルを削除
print "Cleaning in $IMGDIR_BIG/???.$EXT .. ";
opendir DIR, $IMGDIR_BIG or die "$dir:$!";
while (my $files_in_webdir = readdir DIR) {
    next if $files_in_webdir =~ /^\.{1,2}$/; # '.'や'..'も取れるので、スキップする
    if ($files_in_webdir =~ /^[0-9][0-9][0-9]\.$EXT$/) {
	unlink "$IMGDIR_BIG/$files_in_webdir";
    }
}
closedir DIR;
print " done.\n";

# HTML, RAM ファイルの作成. 重複分は無視.
$i = 0;
$skipped_num = 0;
$| = 1; # print 後にフラッシュ
$ret = "";
print "Making HTML, RAM files in $WEBDIR\n";
while ($ohp_num[$i]) {
    
    # ファイル名の作成
    $num = sprintf("%03d", $ohp_num[$i]); 
    $htmlfile = "$num.$HTML";
    $ramfile = "ram/$num.ram";
    $e = 0;
    while ($ends[$e]) {
	if ($i >= $starts[$e]) {
	    $RM_FILE = "$RM_FILES_SLIDE[$e]"; 
	}
	$e ++;
    }
    
    # HTML ファイルが存在するかの判定. 
    unless (-f "$WEBDIR/$htmlfile") {

	# メッセージ出力
	$ret = "\r" if ($i > 0);
	print "${ret} [$i/$#ohp_num] -> $htmlfile, $ramfile ";
	print "\n                        :\n" if ($i == 0);
    
	# RAM ファイルを作成 (HTML が存在しない場合のみ)
	open (RAM, ">$WEBDIR/$ramfile");
	print RAM "$RTSP_DIR/$RMDIR/smi/$num.smi";
	close(RAM);

	# 画像ファイルのシンボリックリンクを作成
	$cmd_lnk = "cd $IMGDIR_BIG; ln -s ../../$IMGDIR_WEB/$num.$EXT ./";
	print "$IMGDIR_BIG/$num.$EXT";
	system($cmd_lnk);

	#HTML ファイル作成
	&print_html($htmlfile, $num);
    
	#メニュー画面用にファイル名, 題名の情報を保管
	push (@numbers, $num);
	push (@rams, $ramfile);
	push (@files, $htmlfile);
	push (@titles, $ohp_title[$i]);
	push (@RM, $RM_FILE);
    } else {
	$skipped_num++;
    }
    
    $i++;
}
print "\n $skipped_num files are skipped for overlap. ";
print " ... done.\n ";
$| = 0; # デフォルトのバッファリングへ戻す
@tmp = @numbers;
$end = pop(@tmp);


#講演者 URL が空か否かのチェック
if ($LEC_WEB =~ /^$/) {
    $LECTURE =""; 
}else{
    $LECTURE = "<li><a target=\"_top\" href=\"$LEC_WEB\">$LEC_TXT</a><br>"; 
}

#表紙ファイル名
if ($TOP =~ /^$/){
    $num = sprintf("%03d", $ohp_num[0]); 
    $TOP = "$num.$HTML"; 
}

# menu ファイル作成
&print_menu(); 

# index ファイルの作成
&print_index();

#HTML ファイルのリスト部作成
&print_html_list();

print basename($0) . ": Successful \n";


###================================================================
# 目次ファイルの作成 

sub print_menu { 
    open (MENU, "> $WEBDIR/menu.$HTML");
    print MENU <<EOM1
<html>
<head>
<title> $TITLE </title>
<meta HTTP-EQUIV="Content-type" CONTENT="text/html; charset=euc-jp">
<style type="text/css">
<!--
A { text-decoration:none; }
-->
</style>
</head>

<body text="#000000" link="#6600ff" alink="#0033ff" vlink="#003399" bgcolor="#FFFFFF">

<table width="100%" bgcolor="#9999ff">
  <tr> <td>
  $TITLE_MENU1
  </td></tr>
</table>

<ul>
  $LECTURE
  <li><a target="_top" href="$PHOTO">$PHOTO_TXT</a><br>
  <li><a target="_top" href="$CR_WEB">$CR_TXT</a>
  <li><a target="_top" href="$PJ_WEB">$PJ_TXT</a>
</ul>

<table width="100%" bgcolor="#9999ff">
  <tr> <td>
   $TITLE_MENU2
  </td></tr>
</table>

<ol><small>
INSERT_SLIDE_LIST
</small></ol>
    

<table width="100%" bgcolor="#9999ff">
  <tr> <td>
   $TITLE_MENU4
  </td></tr>
</table>
<small>
<dl>
<dd>$MENU_TXT
</dl>
</small>

INSERT_VIDEO_DOWNLOAD
</body>
</html>
EOM1
    ;
    close (MENU); 


    #リストを挿入
    system ("cp $WEBDIR/menu.$HTML $WEBDIR/menu-bk.$HTML"); 
    open (READ, "$WEBDIR/menu-bk.$HTML");
    open (MENU, ">$WEBDIR/menu.$HTML");
    while (<READ>) {
	chomp($_); 
	if ($_ =~ 'INSERT_SLIDE_LIST'){
	    $i = 0;
	    while ($files[$i]){
		print MENU "  <li><a target=\"display\" href=\"$files[$i]\">$titles[$i]</a> \n";
		$i++;
	    }
	}elsif ($_ =~ 'INSERT_VIDEO_DOWNLOAD') {
	    if ($DL) {
		print MENU <<EOM2
<table width="100%" bgcolor="#9999ff"> 
<tr> <td>
  $TITLE_MENU3
</td></tr>
</table>
EOM2
    ;
		$i = 0;
		print MENU "<ul> \n"; 
		while ($TRT_FILES[$i]){
		    if ($RM_FILES_SLIDE[$i] !~ /^$/) {
			print MENU "  <li><a href=\"../$RMDIR/$RM_FILES_SLIDE[$i]\">$VD [$s1[$i]-$s2[$i]]</a> \n";
		    }
		    $i++;
		}
		print MENU "</ul> \n"; 
	    }
	}else{
	    print MENU "$_ \n";
	}
    }
    close(MENU);
    close(READ);
    unlink ("$WEBDIR/menu-bk.$HTML"); 
    
}



###================================================================
# HTML ファイルを作成するためのサブルーチン
sub print_index {
    open (INDEX, ">$WEBDIR/index.$HTML");
    print INDEX <<EOI
<html>
<head>
<title> $TITLE </title>
<meta HTTP-EQUIV="Content-type" CONTENT="text/html; charset=euc-jp">
<style type="text/css">
<!--
A { text-decoration:none; }
-->
</style>
</head>

<frameset cols="20%, 80%">
<frame name="menu" src="./menu.$HTML">
<frame name="display" src="./$TOP">
</frameset>

</html>
EOI
	;
    close (INDEX);
}



###================================================================
# HTML ファイルを作成するためのサブルーチン
sub print_html {
    my($file, $number) = @_; 

    open (HTML, ">$WEBDIR/$file");
	
    print HTML <<EOT
<html>
<head>
<title> $TITLE </title>
<meta HTTP-EQUIV="Content-type" CONTENT="text/html; charset=euc-jp">
<style type="text/css">
<!--
A { text-decoration:none; }
-->
</style>
</head>

<body text="#000000" link="#6600ff" alink="#0033ff" vlink="#003399" bgcolor="#FFFFFF">

<hr color="#9999ff" noshade size="5">
<table width=90% border="0" cellpadding="0" cellspacing="0">
<tr>
<td align="right" colspan="2">
$DATE $PLACE<br>
$NAME ($MEMBERSHIP) <br>
$TITLE
</td>
</tr>
</table>

<hr color="#9999ff" noshade size="4">
<table width=90% border="0" cellpadding="0" cellspacing="0">
<tr>
<td align="left" valign="top">
  INSERT_VIDEO_ICON
  INSERT_PREVIOUS_ICON
  INSERT_NEXT_ICON
</td>   
<td align="right" valign="top">
  <a target="_top" href="./index.$HTML">$ICON4</A>
</td>   
</tr>
</table>

<hr color="#9999ff" noshade size="4">
<table width=90% border="0" cellpadding="0" cellspacing="0">
<tr>
<td colspan="5"><img src="./$IMGDIR_BIG/$number.$EXT"></td>
</tr>
</table>
<hr color="#9999ff" noshade size="4">
<table width=90% border="0" cellpadding="0" cellspacing="0">
<tr>
<td align="left" valign="top">
  INSERT_VIDEO_ICON
  INSERT_PREVIOUS_ICON
  INSERT_NEXT_ICON
</td>   
<td align="right" valign="top">
  <a target="_top" href="./index.$HTML">$ICON4</A>
</td>   
</tr>
</table>

<hr color="#9999ff" noshade size="4">
<div align="right">$HOST</div> 
<div align="right"><a target="_top" href="$HOST_WEB">$HOST_WEB</a></div>
<hr color="#9999ff" noshade size="4">
</body>
</html>
EOT
	;

    close (HTML);
}
	


sub print_html_list{

    $i = 0;
    while ($files[$i]){
	
	system ("cp $WEBDIR/$files[$i] $WEBDIR/$files[$i].bk"); 
	open (READ, "$WEBDIR/$files[$i].bk");
	open (HTML, ">$WEBDIR/$files[$i]");
	
	while (<READ>) {
	    chomp($_); 
	    if ($_ =~ 'INSERT_VIDEO_ICON'){
		if ($RM[$i] =~ /^$/){
		    print HTML "  $ICON1 \n";
		}else{
		    print HTML "  <a href=\"$rams[$i]\">$ICON1</a> \n"; 
		}
	    }elsif($_ =~ 'INSERT_PREVIOUS_ICON'){
		if ($i == 0){
		    print HTML "  $ICON2 \n";
		}else{
		    print HTML "  <a href=\"$files[$i-1]\">$ICON2</a> \n"; 
		}
	    }elsif($_ =~ 'INSERT_NEXT_ICON'){
		if ($numbers[$i] == $end) {
		    print HTML "  $ICON3 \n"; 
		}else{
		    print HTML "  <a href=\"$files[$i+1]\">$ICON3</a> \n"; 
		}
	    }else{
		print HTML "$_ \n"; 
	    }
	}
	close (READ);
	close (HTML);
	unlink ("$WEBDIR/$files[$i].bk");
	$i++;
    }
}




