docutilsとeast_asian_widthとSimpleTable

reStructuredTextで、テーブルを記述する方法に、SimpleTableとかGridTableがある。SimpleTableならこんな感じ。

==== ====
ほげ ほげ
==== ====
がお がお
---- ----
ふー ふー
==== ====

で、reStructuredTextの標準処理系であるdocutilsのparserは、east_asian_widthを利用することで、「ほ」が全角文字だと判断している。
だが、このeast_asian_widthは、全角記号に対しては'W'(幅広文字)でも'F'(全角文字)でもなく、'A'(あいまい)を返し、docutils 0.4 では半角文字と同じ幅として処理されてしまっている。
これは設計者の意図通りの動作*1なのだが、日本では使いにくい。

で、'A'も全角文字にするには、docutils/statemachine.pyの StringList::pad_double_width() で、

-                    if east_asian_width(char) in 'WF': # 'W'ide & 'F'ull-width
+                    if east_asian_width(char) in 'WFA': # 'W'ide & 'F'ull-width

utils.pyで、

east_asian_widths = {'W': 2,   # Wide
                     'F': 2,   # Full-width (wide)
                     'Na': 1,  # Narrow
                     'H': 1,   # Half-width (narrow)
                     'N': 1,   # Neutral (not East Asian, treated as narrow)
-                     'A': 1}   # Ambiguous (s/b wide in East Asian context,
+                     'A': 2}   # Ambiguous (s/b wide in East Asian context,
                               # narrow otherwise, but that doesn't work)

とすれば良い。

TODO: 全角文字判定をstatemachine.pyからlanguageに移動し、jaでは east_asian_width(char) in 'WFA' とするパッチを作って送る。

*1:探してみたら、このパッチを実装された方のBlogが見つかった。 http://city.plala.jp/blog/Python

このブログに乗せているコードは引用を除き CC0 1.0 で提供します。