[FrontPage] 更新履歴 - サイトマップ - "CommentForZWikiJapanesePatch" 配下のコンテンツ - 過去を発掘 | [Snap.Shot]

to FrontPage CommentForZWikiJapanesePatch

(Sun, 06 Aug 2006 11:24:18 GMT+9)

拙作ZWiki日本語パッチの解説

(2002-07-14 takano) koyoshiさん からメールをいただきました:

この度、必要に迫られ、ZWiki0.9.9+Zope2.5.1でのStructureTextの
機能不全を対処すべく、たかのさんの2.5.0のpatchを参考に替えて試ま
したら、何とか動作した様です。
しかしながら自分には、このコードが全く理解出来ず。単に機械的に
替えたに過ぎず。それでいいものか判りません。
個人用途には、そのレベルでも充分なのですが、公開することも出来ず
困っています。

…えー困ったな。ソースに書いてある通りで、ソース読めない人に解説できるほどの技量は私には無いぞ。

と、見捨てちゃうのも(元ネタを振った身としては)マズいので、簡単に解説かきます。 ここでは私が最後に触った Zope-2.4.3 + ZWiki-0.9.8 をベースに書きます。これ↓ね。

http://zwiki-i18n.sourceforge.net/ZWiki/Zope-2.4.3-STmb-ja1.patch

前提:もともとのStructuredTextの実装自体がおかしい!

StructuredTextは、そもそも「まずプレーンテキストで書く」ことを前提にしているはず。 つまり、まずプレーンテキストとしての可読性を確保した上で、これをHTMLやPDFで再利用しよう という考えに基づいているはず。

ところが実際の使われ方はムチャクチャ。途中に勝手にHTMLタグをビシビシ入れて、とにかく 自分の思ったとおりの見栄えにしようとガリガリにいじられてしまう。

なんでかというと、まずHTMLとして読みやすいドキュメントが書けないのよ。 StructuredTextHTMLのレンダリング性能がタコなせいで。

私のパッチは、その手のウンコ実装を回避し、ちゃんと日本語でStructuredTextを書けるように するためのもの。

対策1:letters

まずは STletters.py の冒頭:

digits      = string.digits
-letters     = string.letters
+#letters     = string.letters
+letters     = string.letters + '\200-\377\?\!'
literal_punc = punc_func("'")
dbl_quoted_punc = punc_func("\"")
strongem_punc = punc_func('*')

これは、あらゆる「文字列」として英数字しか受け入れないというタコの修正。 たとえば、オリジナルだと:

"First Link":MyLink
"Second Link", http://www.example.com/second

は受け入れるクセに:

"最初のリンク":MyLink
"二番目のリンク", http://www.example.com/second

は受け入れない。つまりquoteされた中身は英数字であるべきなんだと。アホか。 とりあえず英数字といわず、8ビット目が立ったすべての文字を通してしまうようにする。

対策2:リテラルはリテラルとして扱え!

これは本家ZWikiでも抱えている問題のハズ:

'literal*test' OK!*

とかが、 * 文字を扱った 強調 を優先されて、見るも無惨に壊される。 これを回避するには、まずリテラルの優先順位を上げる。 DocumentClass.py を見よ:

--- Zope-2.4.3-src/lib/python/StructuredText/DocumentClass.py     Tue Nov  6 22:47:02 2001
+++ Zope-2.4.3-ja1/lib/python/StructuredText/DocumentClass.py     Wed Jan 16 16:30:58 2002
@@ -370,9 +370,9 @@
'doc_sgml',
'doc_href1',
'doc_href2',
+        'doc_literal',
'doc_strong',
'doc_emphasize',
-        'doc_literal',
'doc_underline',
'doc_sgml',
'doc_xref',

逆にsingle quoteが強すぎても困るので、リテラルの前後にはスペースが必須ということにしよう:

@@ -860,7 +860,8 @@
def doc_literal(
self, s,
-        expr = re.compile(r"(\W+|^)'([%s%s%s\s]+)'([%s]+|$)" % (letters, digits, literal_punc, phrase_delimiters)).search,):
+        expr = re.compile(r"([%s]+|^)'([%s%s%s\s]+)'([%s]+|$)" % (phrase_delimiters, letters, digits, literal_punc, phrase_delimiters)).search,):

とりあえず、これで WikiName も抑止できるぞ。 ついでに 下線 も前後にスペースが必要にしてしまおう。

対策3:とにかくオマエのHTMLむちゃくちゃ。

なんでもかんでも:

<html>
<body>

とかつけようとするな! ちゃんと描画時に「ヘッダ出力の可否」をパラメータとして渡すようにすべし。 StructuredText/__init__.py :

@@ -94,10 +94,10 @@
ClassicHTML=HTML
HTMLNG=HTMLClass.HTMLClass()
-def HTML(src, level=0, type=type, StringType=type('')):
+def HTML(src, level=0, header=1, type=type, StringType=type('')):
if type(src) is StringType:
-        return ClassicHTML(src, level)
-    return HTMLNG(src, level)
+        return ClassicHTML(src, level=level, header=header)
+    return HTMLNG(src, level=level, header=header)

デフォルトはヘッダ出力ありでよいな。でも外から「ヘッダ出さないでくれー」と言われたら ちゃんと言うこときくべし。

これはZopeの最近の版では直っているやもしれず。

まとめ(というか愚痴)

StructuredTextのソースを少しでもちゃんと眺めていれば分かると思うんだが、 これのレンダリングは正規表現依存バリバリで、しかもかなりいい加減。

しかも、仕様書が無いに等しい。 StructuredText の仕様書と言われているやつは、 いちおう これ とか これ「こうあってほしいなー」 というのは書かれているんだけど、たとえばじゃぁそれが入れ子に なったらどうなるんだとか、そういう仕様が一切無い。 一方ソース見てると、明らかにどこにもドキュメントの無いルールがある。

仕様にしたいんだったらBNFで書け、BNFで。

…なんてことを、本家まで行ってわざわざ闘うだけの元気はとても無いので、 私はもうStructuredTextまわりを触りたくありません。以上。

わすれていた、

UsingCvsAtSourceForge

追記

2002-08-05 takano
reStructuredText というのがあるそうです。 PEP287 も参考に。
2002-08-05 takano
koyoshiさんの最新リリース をどうぞ。
2003-10-07 takano
たはらさんが2.6版のパッチをつくった そうです。

  HelpPage メールでコメント

© 2000-2013 Yukimasa TAKANO, all RIGHTs reserved.