Source

attachments / 20120113_japanesesupport.py

Full commit
#!/usr/bin/env python
# coding: utf-8

# 基は標準ドキュメント翻訳プロジェクトで使用しているもの
# 自分でもこれがどういう仕組みで動いているかよく分からないので
# 有志の方による改良希望

# 強調については、強調に句読点が含まれる可能性を考えると面倒な事になりそうなので後でやる

from docutils.nodes import Text, paragraph
import re

# マークアップと句読点が連続するとき、空白を開けなくても、
# システム側で自動的に空白を挿入しておいてくれる。
# なお、この作業は rst のソース読み込み (source-read) 時に処理しないと間に合わない。
_PAT0 = re.compile(ur"([`_])([、。?!])")
_PAT1 = re.compile(ur"([、。?!])([`:])")

# 改行前後が非latin-1な文字なら連結。
# これは、標準ドキュメント翻訳プロジェクトで使用しているものを
# 転用させていただいた。
_PAT2 = re.compile(ur"([^\u0000-\u00ff])\n([^\u0000-\u00ff])")
# 句読点の前後に空白があれば連結。
_PAT3 = re.compile(ur"[\n ]*([、。?!])")
_PAT4 = re.compile(ur"([、。?!])[\n ]*")

def separate_markup(app, docname, source):
    if not app.config.japanesesupport_separate_markup:
        return
    #source は単要素のリスト、その要素は Unicode 型
    source[0] = _PAT0.sub(ur"\1\\ \2", source[0])
    source[0] = _PAT1.sub(ur"\1\\ \2", source[0])

def trunc_whitespace(app, doctree, docname):
    if not app.config.japanesesupport_trunc_whitespace:
        return
    for node in doctree.traverse(Text):
        if isinstance(node.parent, paragraph):
            newtext = _PAT2.sub(ur"\1\2", node.astext())
            newtext = _PAT3.sub(ur"\1", newtext)
            newtext = _PAT4.sub(ur"\1", newtext)
            node.parent.replace(node, Text(newtext))

def setup(app):
    app.add_config_value('japanesesupport_trunc_whitespace', True, True)
    app.add_config_value('japanesesupport_separate_markup', True, True)
    app.connect("source-read", separate_markup)
    app.connect("doctree-resolved", trunc_whitespace)