Skip to content

Instantly share code, notes, and snippets.

@nishio
Created December 5, 2012 07:26
Show Gist options
  • Save nishio/4213402 to your computer and use it in GitHub Desktop.
Save nishio/4213402 to your computer and use it in GitHub Desktop.
rst2textileのend_stateの仕様について質問→自己解決
元々のコード
def visit_literal_block(self, node):
self.new_state(0)
def depart_literal_block(self, node):
self.end_state(wrap=False, first="<pre>\n", end=['</pre>'])
出力されるもの
<pre>
source line 1
source line 2
source line 3
</pre>
これを以下のようにしたいと思った
<pre>
source line 1
source line 2
source line 3
</pre>
ソースコードを1行変更
def visit_literal_block(self, node):
self.new_state(4) # here!
def depart_literal_block(self, node):
self.end_state(wrap=False, first="<pre>\n", end=['</pre>'])
得られた出力
<pre>
source line 1
source line 2
source line 3
</pre>
疑問点: これはend_stateの意図した挙動か?
続き
このあたりの実装は"\n" not in fisrtを仮定しているようにみえる
https://bitbucket.org/shimizukawa/rst2textile/src/5590827a66a64dc158dbe05a672c34eb8f943da3/docutils_textile/writer.py?at=default#cl-91
しかしここで\n付きで読んでいるあたりにミスマッチなものを感じる
https://bitbucket.org/shimizukawa/rst2textile/src/5590827a66a64dc158dbe05a672c34eb8f943da3/docutils_textile/writer.py?at=default#cl-570
first == Noneならコンテンツの1行目もインデントされる。
僕のユースケースは本当は<pre>の必要がなくて、ただインデントしたかっただけなので、これでいいや。
最終的な僕の実装
def visit_literal_block(self, node):
self.new_state(4)
def depart_literal_block(self, node):
self.end_state(wrap=False, first=None, end=[''])
得られた(僕が得たかった)もの
source line 1
source line 2
source line 3
@shimizukawa
Copy link

バグっぽい。そのうち直すかも。

@shimizukawa
Copy link

あっ、ちがう、インデントが崩れてるのは @nishio の改造版か。インデントいれた実装にそのうち直すかも(遠い未来に)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment