2008年11月23日日曜日

Groovyでテキスト処理を試す

組版・DTP関連でプログラムを使ったテキスト処理をするなら、普通はsed、perl、rubyなんかを使うと思う。でもここはあえてgroovyでやってみる。

まずテキストを用意。青空文庫から「我輩は猫である」のテキスト版を引っ張ってきて、それの一部を使うことにする。
 吾輩《わがはい》は猫である。名前はまだ無い。
 どこで生れたかとんと見当《けんとう》がつかぬ。何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。吾輩はここで始めて人間というものを見た。しかもあとで聞くとそれは書生という人間中で一番|獰悪《どうあく》な種族であったそうだ。この書生というのは時々我々を捕《つかま》えて煮《に》て食うという話である。しかしその当時は何という考もなかったから別段恐しいとも思わなかった。ただ彼の掌《てのひら》に載せられてスーと持ち上げられた時何だかフワフワした感じがあったばかりである。掌の上で少し落ちついて書生の顔を見たのがいわゆる人間というものの見始《みはじめ》であろう。この時妙なものだと思った感じが今でも残っている。第一毛をもって装飾されべきはずの顔がつるつるしてまるで薬缶《やかん》だ。その後《ご》猫にもだいぶ逢《あ》ったがこんな片輪《かたわ》には一度も出会《でく》わした事がない。のみならず顔の真中があまりに突起している。そうしてその穴の中から時々ぷうぷうと煙《けむり》を吹く。どうも咽《む》せぽくて実に弱った。これが人間の飲む煙草《たばこ》というものである事はようやくこの頃知った。

この文章を"waganeko.txt"としてSJISで保存。とりあえずデスクトップに置く。
それに対して、
  • ルビにxhtml風のタグをつける。
  • 行ごとに<p></p>タグをつける。
  • 語尾が"んぬ。"で終わるようにする。
  • SJISのテキストをUTF8にする。
  • .htmlをつけて保存。
ここまでやってみる。
以下Groovyコード。
def inputCharCode = "SJIS" //入力側文字コード
def outputCharCode = "UTF8" //出力側文字コード

//変換マップ※なぜか行頭にスペースがないとエラーになる?
def replaceTable=[
/^/:"<p>",
/$/:"</p>",
/\n/:"</p><p>",
/|{0,1}([一-龠]+?)《([ぁ-ん]+?)》/:
{ m0, m1, m2 -> "<ruby><rb>$m1</rb><rt>$m2</rt></ruby>" },
"。":"んぬ。"
]

//--------------------処理ここから--------------------
if(args.length < 1){
println("ファイルを指定して下さい。")

}else{
//argsが1個以上なら数を数えてループ
for(i in 0..< args.length){

//ファイルの中身を読む
def file = new File(args[i])
String str = file.getText(inputCharCode)

//変換マップの中を順に置換する
replaceTable.each{key,value -> str=str.replaceAll(key,value)}

//同じ名前の.htmlを作って書き込み
String newPath = args[i].replace(".txt",".html")
def dir = new File(newPath)
dir.write(str,outputCharCode)
println("-------------${newPath}を書き出しました。")
}
}

これをテキストエディタに貼付け、"aozora.groovy"って名前をつけて保存。とりあえずデスクトップに置く。
ターミナルを立ち上げ、
$ cd Desktop/
$ groovy aozora.groovy waganeko.txt
---------------waganeko.htmlを書き出しました。

とすれば、waganeko.htmlが書き出される。

確認のために、XHTMLルビサポートというFirefox用アドオンがあるので、それをインストールしてFirefoxで開いてみよう。

Pタグ以下しかないんで、完璧なhtmlになってはいないけれど、そのへんはテストってことで。

変換を変えたいのなら、変換マップの中身を書き換えればいいだけ。
簡単だ!

0 件のコメント: