﻿#1.文字コードなどの定義
use strict;
use warnings;
use utf8;
use Encode qw/encode decode/;

#2.読み込みと書出し用のファイルを開く
my $file1 = 'Liya-shakumon.html';
open my $fh1, '<', $file1
  or die "Can't open $file1:$!";
my $file2 = 'shakumon.txt';
open my $fh2, '>>', $file2
  or die "Can't open $file2:$!";
my $file3 = 'setumei.txt';
open my $fh3, '>>', $file3
  or die "Can't open $file3:$!";



#3.変数の定義
my $line = "";#読み込み行を格納する
my $switch = "";#ヘッダー・目次と本体を区別するためのスイッチを格納する
my $midashi = "";#見出しのアンカーを格納する
my $yoshikinaijosu01 = 0;#各様式内に文書や簡面につける通し番号。01は、文書などの様式的単位を数え、見出し行が出現するたびに「0」に戻す。02は、一つの様式単位の釈文が二つ以上の簡面にわたる場合に、簡面を数える。簡番号が出現するたびに一つ逓増し、「釈読情報」の行が出現するたびに「0」に戻す。（最低の釈文単位は簡面であるが、様式論的につながっている二つ以上の簡面や簡の釈文も一つの単位として認識する必要がある）
my $yoshikinaijosu02 = 0;
my %shakumon;#簡番号をキーに、釈文を格納する
my %bunrui;#簡番号をキーに、様式分類を格納する
my %josu01;#簡番号をキーに、様式分類内の序数を格納する
my %josu02;#簡番号をキーに、簡面の序数を格納する
my %setumei;#簡番号をキーに、原釈文の「【説明】」以下の注記を格納する
my @junban;#出力用に、出現順に簡番号を記憶させる。
my $mikan ="";
my $mikanari = 0;
my $kanbango = "";

#4.釈文ファイルの読み込みと要素の識別
while ($line = <$fh1>) {
	#4.1.ユニコード関係の設定
	$line =decode('utf8', $line);
	$line =~ s/[\?\r\n\f]//g;
	$line =~ s/^\x{FEFF}//;
#	print $fh2 (encode('utf8',"新しい行：\n".$line."\n"));
	#4.2.要素（Head,Header(メニュー),Body(見出しや簡単位の釈文本文)）の識別
	if ($line =~ /^<[^\/]+>$/){
		if ($line =~ /^<head>$/){
			$switch = "h";
		}
		elsif ($line =~ /^<header/){
			$switch = "m";
		}
		elsif ($line =~ /^<body>$/){
			$switch = "b";
		}
	}
	#4.3.各要素の値を識別してハッシュに追加
	if ($switch eq "h" || $switch eq "m"){
		next;
	}
	elsif ($switch eq "b"){
		if ($line =~ /^<h\d id=\"([^\"]+)/){
			$midashi = $1;
			$yoshikinaijosu01 = 0;
		}
		elsif ($line eq "" || $line =~ /^<p>　<\/p>$/ || $line =~ /^<[^p]/ || $line =~ /^[^<]/ || $line =~ /<com>/ || $line =~ /<yomi>/){
			next;
		}
		elsif ($line =~ /^<p/){
			if ($line =~ /釈読情報/){#文書末尾の行にヒットする
				$yoshikinaijosu01 ++;
				$yoshikinaijosu02 = 0;
			}
			elsif ($line =~ /zuhan[^>]+>([^<]+)/ && $mikanari == 0){#一行のみの釈文にヒットする
				$kanbango = $1;
				@junban = (@junban,$kanbango);
				if ($line =~ /\t*(【説明.+)<\/p>/){
					$setumei{$kanbango} = $1;
					$line =~ s/\t*$1//;
				}
				$shakumon{$kanbango} = $line;
				$bunrui{$kanbango} = $midashi;
				$josu01{$kanbango} =$yoshikinaijosu01;
				$josu02{$kanbango} =$yoshikinaijosu02;
				$yoshikinaijosu02 ++;
				$mikanari = 0;
			}
			elsif ($line =~ /zuhan[^>]+>([^<]+)/ && $mikanari == 1){#複数行にわたる釈文の末尾行にひっとする。
				$kanbango = $1;
				@junban = (@junban,$kanbango);
				if ($line =~ /\t*(【説明.+)<\/p>/){
					$setumei{$kanbango} = $1;
					$line =~ s/\t*$1//;
				}
				$shakumon{$kanbango} = $mikan."\n".$line;
				$bunrui{$kanbango} = $midashi;
				$josu01{$kanbango} =$yoshikinaijosu01;
				$josu02{$kanbango} =$yoshikinaijosu02;
				$yoshikinaijosu02 ++;
				$mikanari = 0;
			}
			elsif ($mikanari == 0){#複数行にわたる釈文の末尾行以外の行にヒットする。
				$mikan = $line;
				$mikanari =1;
			}
			else {
				$mikan = $mikan."\n".$line;
			}
		}
		else {
			$line = encode('utf8',"問題あり：\n".$line."\n");
			print $fh2 ($line);
		}
	}
}

#4.「@junban」から、釈文ファイルの順番に簡番号を呼び出し、その簡番号をキーに釈文様式分類と様式内の序数をファイルに出力する。
for (my $i = 0; $i < @junban; $i++){
	$kanbango = $junban[$i];
	print $fh2 (encode('utf8',$bunrui{$kanbango}."\t".$josu01{$kanbango}."\t".$josu02{$kanbango}."\t".$kanbango."\n".$shakumon{$kanbango}."\n"));
}

#5. 原釈文に付された【説明】を簡番号順に出力
foreach my $bango(sort keys %setumei){
	print $fh3 (encode('utf8',$bango."\t".$setumei{$bango}."\n"))
}

#6.ファイルを閉じる
close $fh1;
close $fh2;
close $fh3;