ルビのため perl unicode正規表現

2013/2/22 [09:13:24] (金) 天気

EPUB3::かんたん電子書籍作成 http://books.doncha.net/epub/ では、テキストデータにルビや縦中横のHTMLタグを自動で振るためのオプションを用意してある(※ ページ中ほどにある [スクリーンショット、ルビや縦中横タグを挿入するにはこちら] のリンク)


そのための perl の正規表現メモ。


縦中横。

半角の、「!?」「!!」「?!」と、連続するアルファベット、連続する数字に span タグで縦中横のクラス tcy をつける。


マジか!? → マジか<span class="tcy">!?</span>
体重45kg → 体重<span class="tcy">45</span><span class="tcy">kg</span>
s/(\!\!|\!\?|\?\!|[a-zA-Z]+|[0-9]+)/<span class="tcy">$1<\/span>/g


ルビ。

「漢字(るび) 」と漢字に続いて半角のカッコに囲まれたひらがな・カタカナをルビとして ruby rt タグをつける。

※ WORDのルビつき文書をテキストで出力すると半角カッコの中にルビが入る


般若心経(はんにゃしんぎょう) → <ruby>般若心経<rt>はんにゃしんぎょう</rt></ruby>
超新星(スーパーノヴァ) → <ruby>超新星<rt>スーパーノヴァ</rt></ruby>
s!([\p{InCJKUnifiedIdeographs}]+\x{3005}?)\(([\p{InHiragana}\p{InKatakana}]+)\)!<ruby>$1<rt>$2</rt></ruby>!g

\x{3005} は「々」


縦中横のタグはけっこうよく使う正規表現なのですんなり。でもルビのための漢字判定がちょっとわからずグーグル様。perlは5.8以降、ユニコードによる正規表現が使えるようになって、文字クラスを下記のように指定することができる。



\p{InBasicLatin}   半角英数字と半角記号
\p{InHiragana}     平仮名
\p{InKatakana}     カタカナ
\p{InCJKUnifiedIdeographs}   漢字
\p{InCJKSymbolsAndPunctuation}   全角記号
\p{InHalfwidthAndFullwidthForms} 半角カナなど


ルビもこれを使って正規表現。でも、スクリプトでは、どこからルビなのか判断できない。東京都千代田区(ちよだく)と書いてあったら、「千代田区」ではなく「東京都千代田区」に「ちよだく」のルビがつく。「千代田区」にルビですよということで「東京都[#ルビ]千代田区(千代田区)」などとテキストにマークアップする必要がある。


「EPUB3::かんたん電子書籍作成」 のコンセプトは

「何も考えずにテキストを放り込んだら、それっぽい電子書籍ができる」


面倒っぽく感じる・小難しそうなことは極力排除したいので、Wikiやはてなで使われるような独自記法・方言マークアップは却下とした。

レイアウトデザインを作り込みたいということであれば(字下げや文字方向一部変更など)EPUB3ファイルを解凍して直接xhtmlに対してタグをつけて、CSSを作れば可能。「かんたん電子書籍作成」で作るHTMLとCSSは、こんなでいいのかというぐらい手抜きレベルに単純なHTMLなので、編集加工がしやすい元素材でもある。


HTMLタグのついたテキストデータで小説原稿などを保存管理するのは面倒なので、元原稿はプレーンな状態にしておきたい。間違えて元データを消してしまって、HTMLタグのついたデータしか残ってない!という場合に。


テキストデータからHTMLタグを除去する正規表現


s!<rt>[^<]+</rt>!!g ルビ除去
s!<[^>]+>!!g HTMLタグ除去


<<2026/1>>
    123
45678910
11121314151617
18192021222324
25262728293031
検索:

【最近の20件】