GAEでDocutilsを使う方法

GAEで動くアプリケーションでDocutilsを使おうとしたところ、何故かエラーが発生してしまいました。エラーメッセージを読むと、GAEでは使用不可能なAPIを、Docutilsが内部で使用しているため、このようなエラーが発生してしまうということが分かりました。

この問題の解決方法は、既にこちらのページで紹介されています。その方法は、docutils/frontend.pyの以下の部分をコメントアウトするというものです。

if read_config_files and not self.defaults['_disable_config']:
    try:
        config_settings = self.get_standard_config_settings()
    except ValueError, error:
        self.error(error)
    self.set_defaults(**config_settings.__dict__)

しかし、この部分のソースをよく見ると、self.defaultという名前のディクショナリ(おそらく設定か何か)の_disable_configがTrueになっていれば、問題の部分を実行しないということが分かります。案の定、Djangoプロジェクトのsettings.pyに以下の設定を加えるだけで、この問題は解決することが出来ました。

RESTRUCTUREDTEXT_FILTER_SETTINGS = dict(_disable_config=True)

DocutilsのAPIを直接使う場合は、

from docutils.core import publish_parts

source = "HTML化したいreStructuredText形式のテキスト"
settings = dict(_disable_config=True)
parts = publish_parts(source=source, writer_name="html4css1", settings_overrides=settings)
html = parts["whole"]
# html = parts["fragment"]

といったところでしょうか。

ちなみに、Djangoではsettings.py中にRESTRUCTUREDTEXT_FILTER_SETTINGSという名前のディクショナリを作成することで、restructuredtextフィルタの挙動を制御することが出来ます。他の使い方としては、例えば、

RESTRUCTUREDTEXT_FILTER_SETTINGS = dict(initial_header_level=3)

としておけば、見出しで使うタグをh1ではなくh3にすることが出来ます。