天草平家と天草伊曾保の画像・翻刻対照HTMLを作る
突然謎の感情をあらわにすると、日本語史の講読で、講読資料の翻刻を作ったり、翻字したりするのも学習のうちだろうと頭のなかで煩悶が駆け巡るが、それは自分が興味を持ってぶち当たってからでいいというのが昨今らしく、まだ30代半ばなのに隔世の感を覚える。それはさておき、そのような時代背景もあり、天草平家と天草伊曾保については、国語研がありがたくも画像と翻刻を公開してくれているので、標記のものを作ろうと思い至った。(なお、本記事で用語解説は基本的にしない。)
とはいえ、国語研のテキストはローマ字と国語研UniDic流本文であり*1、当時の発音に基づいたローマ字だけでは学生にいきなり渡すにはしんどいところもあり、かといって現代化された表記で適当に発音されるのも耳が喜ばないので、平仮名翻字を用意しておく必要がある。翻字のありかたについては、注1の片岡ほか論考に既存のものが取り上げられているが、音韻・音価の変化の激しい時代であり、読みやすさをあまりに重視して現代的あるいは古典的表記に振ると、当時の音とはかけ離れてしまう問題がある*2。そのへんは、変換ロジックを用意する一手間がある(しかも、のちに見るように、一意に定まる保証はない)。
PDFを作りたかったけれど、断念したので、とりあえずHTMLにした。
あ、画像はcurl的ななにかでよしなに落としておいてください。
変換については、表記の正規化を図った上で変換テーブルを用意するのがけっきょくは実用的である(行またぎの処理が複雑になりすぎるので)。ただし、これでは、san.bia.cuとto.bi.a.ga.ruのように識別不能なものもある。発音としてはっきり区別できていたかは定かでない。このほか、天草伊曾保における外来語には対応できないが(e→イ、tho→トであとはイレギュラーなもののみになるはず)、読み方がはっきりと分らないので、もとよりそのへんは手で直すよりない。これを、原則的に最長一致で変換してゆく。こまかいことがらはプログラムを見てほしい。
#!which perl use strict; use warnings; use utf8; use open qw/ :std :utf8 /; my $argv = shift @ARGV; die "no argument" unless $argv; die "not a file (please check if it is on the same directory)" unless -f $argv; open my $fh, "<", $argv or die; my %table = &convert_table(); my $p = ""; my $l = 1; while (my $line = <$fh>) { chomp $line; next unless $line; if ($line =~ /\A((.+))\z/ms) { $p = $1; $l = 1; next; } # remove line numbers $line =~ s/\A\d+\t//ms; my $orig = $line; # eratta $line =~ s/{.+?}//g; $line =~ tr/«»‹›//d; # normalisation $line =~ s/I([aeiou])/j$1/g; $line =~ tr/A-Z/a-z/; $line =~ s/\Avm\./右馬./ms; $line =~ s/\Aqi\./喜一./ms; $line =~ s/ô/oU/g; $line =~ s/ŏ/aU/g; $line =~ s/ŭ/uU/g; $line =~ s/ã/an/g; $line =~ s/ẽ/en/g; $line =~ s/ĩ/in/g; $line =~ s/õ/on/g; $line =~ s/ũ/un/g; $line =~ s/à/aA/g; $line =~ s/â/aA/g; # possibly a typo of "à" $line =~ s/v/u/g; $line =~ s/ſ/s/g; $line =~ s/([csxtp])\1/Q$1/g; $line =~ s/cq/Qq/g; $line =~ s/ç/C/g; $line =~ s/ij(?![ie])/ii/g; $line =~ s/t\-\z/Q/ms; $line =~ s/\-\z//ms; $line =~ tr/,./、。/; # strong "u" $line =~ s/(?<![qg])ua/わ/g; $line =~ s/(?<![qg])uo/お/g; # logic my @cc = split //, $line; my $transcr = ""; my $length = scalar(@cc); my $i = 0; LOOP: while (1) { last if $i >= $length; for my $j (3, 2, 1, 0) { if ($i + $j < $length) { my $c = join "", @cc[$i .. $i + $j]; if (exists $table{$c}) { $transcr .= $table{$c}; $i += $j + 1; next LOOP; } } } $transcr .= $cc[$i]; $i++; } $transcr =~ s/\s//g; printf "%s-%02d\t%s\t%s\n", $p, $l, $orig, $transcr; $l++; } sub convert_table { my %ct = (); while (my $line = <DATA>) { chomp $line; my @c = split /\s+/, $line; $ct{$c[0]} = $c[1]; } close DATA; return %ct; } __DATA__ a あ A ァ i い y い u う U ゥ e い ca か qi き cu く qu く qe け co こ ga が gui ぎ gu ぐ gue げ go ご sa さ xi し su す xe せ so そ za ざ ji じ gi じ zu ず je ぜ zo ぞ ta た chi ち tCu つ te て to と tho と da だ gi ぢ zzu づ de で do ど na な ni に nu ぬ ne ね no の fa は ha は fi ひ fu ふ fe へ fo ほ ba ば bi び bu ぶ be べ bo ぼ pa ぱ pi ぴ pu ぷ pe ぺ po ぽ ma ま mi み mu む me め mo も ya や yu ゆ ye え yo よ ra ら ri り ru る re れ ro ろ ua わ uo お n ん m ム Q っ t ッ qia きゃ qiu きゅ qio きょ qeo きょ qua くゎ guia ぎゃ guiu ぎゅ guio ぎょ gueo ぎょ gua ぐゎ xia しゃ xa しゃ xu しゅ xo しょ jia じゃ ja じゃ ju じゅ jo じょ cha ちゃ chu ちゅ cho ちょ gia ぢゃ giu ぢゅ gio ぢょ nha にゃ nhu にゅ nho にょ fia ひゃ fiu ひゅ fio ひょ bia びゃ biu びゅ bio びょ beo びょ mia みゃ miu みゅ mio みょ meo みょ ria りゃ riu りゅ rio りょ reo りょ [t] [t]
これで出たものをHTMLに変換する。なお、変換にかけるまえに、国語研のテキストファイルから凡例を消し、(扉)などの箇所を画像ファイル名に合わせておく前提である。
#which perl use strict; use warnings; use utf8; use open qw/ :std :utf8 /; my $argv = shift @ARGV; die "no argument" unless $argv; die "not a file (please check if it is on the same directory)" unless -f $argv; open my $fh, "<", $argv or die; my $xml = <<EOF; <!Doctype html> <html> <head> <meta charset="utf-8"> <title>$argv</title> </head> <body> EOF my @op = (); my $p = ""; my $i = 0; while (my $line = <$fh>) { chomp $line; my @items = split /\t/, $line; my($cur_p, $cur_l) = split /-/, $items[0]; if($p ne $cur_p) { $i++ if $p; $p = $cur_p; } push @{$op[$i]{$p}{orig}}, "<p>$items[1]</p>\n"; push @{$op[$i]{$p}{transcr}}, "<p>$items[2]</p>\n"; } for my $page (@op) { my @keys = keys %{$page}; my $k = shift @keys; my $page_num = $k =~ /^\d+$/ ? sprintf "p%03d", $k : $k; my $orig = join "", @{$page->{$k}{orig}}; my $transcr = join "", @{$page->{$k}{transcr}}; $xml .= sprintf qq(<table id="%s"><tr><td><img src="./or_59_aa_1_%s.jpg"></td><td class="orig">%s</td><td class="transcr">%s</td></table>), $k, $page_num, $orig, $transcr; } $xml .= "</title>"; print $xml;
あとはHTMLを加工するだけ……。
雑に作るとこうなる。