読者です 読者をやめる 読者になる 読者になる

AsciiDocのワイド文字対応手抜きパッチ

主流は、reStructuredTextのようですね。
AsciiDocいいのになあ。

  • DocBookに変換できる。
  • お手軽なわりにOutputの完成度高い。
  • (個人的に)ソースがreStructuredTextより見やすい。

いまいちなのは、ワイド文字だと見栄えがよろしくないこと。タイトルや見出しは、まあ、我慢するとしても、表だけはさすがに激しく面倒。


`-----------`---
くだもの 数

                              • -

りんご 3個
みかん 10個
さくらんぼ 20個
梨 2個

                              • -

とやっても、うまく判定してくれません。*1
AsciiDocでは、文字の見栄えの幅ではなく、数であわせるため、下のように空白を調整する必要があります。


`------`---
くだもの 数

                    • -

りんご 3個
みかん 10個
さくらんぼ 20個
梨 2個

                    • -

はっきりいって、見にくい。いや、醜い。
そこで、適当なパッチを作ってみました。ずいぶん昔に作ったものです。
見た目の幅ではなく、バイト数でアンダーラインの文字数を決めるようにしています。手抜き。

以下、そのパッチ。

--- org_asciidoc.py	2006-03-07 10:25:38.000000000 +0900
+++ asciidoc.py	2006-06-15 19:08:27.760867200 +0900
@@ -1466,8 +1466,8 @@
             if not Title.pattern: return False  # Single-line titles only.
             if len(lines) < 2: return False
             title,ul = lines[:2]
-            title_len = char_len(title)
-            ul_len = char_len(ul)
+            title_len = len(title)
+            ul_len = len(ul)
             if ul_len < 2: return False
             # Fast elimination check.
             if ul[:2] not in Title.underlines: return False
@@ -2528,17 +2528,15 @@
         for row in rows:
             data = []
             start = 0
-            # build an encoded representation
-            row = char_decode(row)
             for c in self.columns:
                 end = start + c.rulerwidth
                 if c is self.columns[-1]:
                     # Text in last column can continue forever.
                     # Use the encoded string to slice, but convert back
                     # to plain string before further processing
-                    data.append(string.strip(char_encode(row[start:])))
+                    data.append(string.strip(row[start:]))
                 else:
-                    data.append(string.strip(char_encode(row[start:end])))
+                    data.append(string.strip(row[start:end]))
                 start = end
             result.append(data)
         return result

*1:ここだけ直接pre打ち込んでmonospace。dirtyだなあ。