attachments / 20120113_japanesesupport.py

#!/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)
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.