Unicode 文字列の折り返し処理をするスクリプト
追記 アップデートあり。
ときどき気が向いては Unicode の仕様書 (UAX) などを読んで遊んだりするんだけど、このたび少し形になったのでご紹介。
作り始めてから公開するまでたぶん三年くらいかかってる。「人生の 0.2 % ルール」によって生まれました。
下のやつはひとつの exe になってるので Python なくてもコマンドラインで動きます。
このスクリプトは、テキストファイルを等幅フォントできれいな見栄えになるように指定された桁数で折り返し整形します。よくあるやつです。が、折り返し処理に Unicode の Line Breaking Algorithm (UAX #14) を実装しています。結合文字やサロゲートペアにも対応しているので、アクセント記号付きアルファベットは当然として、小書きのプ―― U+31F7 (KATAKANA LETTER SMALL HU) U+309A (COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK) ――などが使われるアイヌ語のカタカナ表記や、新しく常用漢字に追加された口偏に「七」の「叱」に似た字形の U+20B9F などが使われた文書でも整形できます(それを表示できるエディタを探すほうがたいへんだけど)。
例:
Japanese:
+-------+-------+-------+-------+-------+-------+---
ある日の事でございます。御釈迦様は極楽の蓮池のふち
を、独りでぶらぶら御歩きになっていらっしゃいました。
池の中に咲いている蓮の花は、みんな玉のようにまっ白
で、そのまん中にある金色の蕊からは、何とも云えない好
い匂が、絶間なくあたりへ溢れて居ります。極楽は丁度朝
なのでございましょう。
English:
+-------+-------+-------+-------+-------+-------+---
Alice was beginning to get very tired of sitting by
her sister on the bank, and of having nothing to
do: once or twice she had peeped into the book her
sister was reading, but it had no pictures or
conversations in it, 'and what is the use of a
book,' thought Alice 'without pictures or
conversation?'
English, justified:
+-------+-------+-------+-------+-------+-------+---
Alice was beginning to get very tired of sitting by
her sister on the bank, and of having nothing to
do: once or twice she had peeped into the book her
sister was reading, but it had no pictures or
conversations in it, 'and what is the use of a
book,' thought Alice 'without pictures or
conversation?'
French, justified:
+-------+-------+-------+-------+-------+-------+---
Pendant un demi-siècle, les bourgeoises de Pont-
l'Évêque envièrent à Mme Aubain sa servante
Félicité.
後半の例のように、justification もできます。
サロゲートペア対応などのため、Python 標準の unicodedata モジュールではなく、自前でおんなじようなライブラリをでっちあげてしまった。Python スクリプト版に同梱されている ucd ディレクトリに入っているモジュールがそれです。が、見ると目が腐る可能性があるので気をつけてください。
さて。この uniwrap.py はもとは等幅フォントを前提にした単なるユーティリティではなく、じつは文字列の幅情報を渡せば任意の論理幅で折り返し処理を行なうことができるクラスが入っているライブラリなのだ。だから GUI のテキスト描画にも使える(実際に wxPython と組み合わせて動いてるよ)。要は、まあ夢があるってことです。ドキュメントとかまだないから、細かくは書けないけど。
最後にコマンドライン・オプションの説明。
Usage: uniwrap.py [オプション] ファイル名
オプション:
-h, --help ヘルプの表示
-e ENCODING, --encoding=ENCODING
ファイルのエンコーディング
-x, --expand-tabs タブをスペースに展開
-j, --justify 両端揃え (justification)
-r, --ruler 結果にルーラーを表示
-t TAB_WIDTH, --tab-width=TAB_WIDTH
タブ幅 <8>
-l, --legacy 全角・半角があいまいな文字を全角として扱う
-w WRAP_WIDTH, --wrap-width=WRAP_WIDTH
折り返し桁数 <60>
-c, --char-wrap 単純な折り返し処理
「全角・半角があいまいな文字を全角として扱う」は説明が必要かな。これは、要はキリル文字やギリシャ文字などを全角として扱うか半角として扱うかというオプションです。JIS の日本語文書では全角として扱われてますが、ユニバーサルな用途としては当然アルファベットのように扱う必要がある。デフォルトでは後者の扱いになっているので、日本語ローカルのエンコーディングで使う時はオンにしたほうがいい、と思う。
しかし uniwrap という名称は、Unicode に対応している折り返し処理、という意味で名づけたのだけど、なんか台所用品ぽいね……。