epub ファイルの dc:language を en から ja に全自動変換するスクリプト

iPod touchシャーロック・ホームズを読みたいなー、と思って、 Project Gutenberg からダウンロードして、iBooksStanza で読んでみた…が、しかし。100年前の英語は非常に読みにくい。iBooks には英英辞典が入っているが、古風すぎる単語を引くと、解説文の英語さえよくわからない…悲しい、NOAD って制限語彙じゃないっけ…。

で、引く辞書を英和に変えられないのかと思って検索してみたら、なんと iBooks ではそれができる可能性があるらしい。後輩の(でも明らかに自分より偉大な) 登さんのブログ記事 によると、epub ファイルをバラして dc:language 要素を ja に変えると、小学館プログレッシブ英和辞典が呼び出されるようになるらしい。

というわけで、それを全自動でやるスクリプトを書いてみた。このスクリプトを実行すると、カレントディレクトリ以下に存在する全ての epub ファイルの中身をバラして、dc:language 要素の値を en から ja に変換できる。大変申し訳ないですがわたくし sed しか使えないので、このスクリプトLinux のシェルか Cygwin でしか実行できません。ライセンスは…じゃあ Apache で。

#! /bin/sh

# a script which converts the content of a "dc:language" element
# in the OPF file in epub files from "en" to "ja". This affects
# the choise of the inline dictionary of iBooks.
#
# Written by Takuya Mishina on 2010-11-06
#
# [prerequisite]
# zip, unzip
# for cygwin users: note that zip and unzip are provided as a 
# separate package!
#


find . -name \*.epub | while read file ; do
    basename=$( basename "${file}" .epub )
    dirname=$( dirname "${file}" )
    mv "${dirname}/${basename}".epub "${dirname}/${basename}".zip
    mkdir "${dirname}/${basename}"
    mv "${dirname}/${basename}".zip "${dirname}/${basename}"
    base=`pwd`
    cd  "${dirname}/${basename}"
    unzip  "${basename}".zip
    rm  "${basename}".zip
    find . -name \*.opf | while read opffile ; do
        mv "${opffile}" "${opffile}".bak
        cat "${opffile}".bak | sed -r -e 's/(]+>)en(.+)$/\1ja\2/g' > "${opffile}"
        rm "${opffile}".bak
    done
    zip -r "../${basename}".zip *
    mv "../${basename}".zip "../${basename}".epub
    cd "${base}"
    rm -rf "${dirname}/${basename}"
done