Sphinx拡張 文字数表示パネル pageinfo.py に、翻訳率表示を加えた拡張です。
pageinfo.py と pageinfo.html を以下のように配置:
sphinx-project/ +- index.rst +- conf.py +- ext/pageinfo.py +- _templates/pageinfo.html
conf.py に設定を追加
Sphinx拡張 文字数表示パネル pageinfo.py に、翻訳率表示を加えた拡張です。
pageinfo.py と pageinfo.html を以下のように配置:
sphinx-project/ +- index.rst +- conf.py +- ext/pageinfo.py +- _templates/pageinfo.html
conf.py に設定を追加
import os | |
import sys | |
sys.path.insert(0, os.path.abspath('ext')) | |
extensions = ['pageinfo'] | |
html_sidebars = { | |
# add 'pageinfo.html' to display the panel. | |
'**': ['localtoc.html', 'relations.html', 'sourcelink.html', 'pageinfo.html', 'searchbox.html'] | |
} |
<div> | |
{% if ascii_count is undefined %} | |
<h4>Page Info</h4> | |
Not provided | |
{% else %} | |
<h4>Page Info</h4> | |
<ul> | |
<li>英数記号: {{ ascii_count }}</li> | |
<li>非アスキー: {{ nonascii_count }}</li> | |
<li>合計文字数: {{ char_count }}</li> | |
<li>半角換算: {{ half_char_count }}</li> | |
<li>全角換算: {{ full_char_count }}</li> | |
</ul> | |
<ul> | |
<li>翻訳率: {{ ((1.0 - lang_en_rate)* 100)|round }} %</li> | |
<li>英語文字数: {{ lang_en_count }}</li> | |
<li>日本語文字数: {{ lang_other_count }}</li> | |
</ul> | |
{% endif %} | |
</div> |
# -*- coding: utf-8 -*- | |
from docutils.utils import column_width | |
from docutils import nodes | |
import langdetect | |
DOMAIN_NAME = 'pageinfo' | |
DEFAULT_PAGEINFO = { | |
'char_count': 0, | |
'half_char_count': 0, | |
'full_char_count': 0, | |
'ascii_count': 0, | |
'nonascii_count': 0, | |
'lang_en_count': 0, | |
'lang_other_count': 0, | |
'lang_en_rate': 0, | |
} | |
def find_text(node): | |
if isinstance(node, (nodes.paragraph, nodes.title)): | |
return True | |
return False | |
def doctree_resolved(app, doctree, docname): | |
domain_data = app.env.domaindata.setdefault(DOMAIN_NAME, {}) | |
pageinfo = domain_data.setdefault(docname, DEFAULT_PAGEINFO.copy()) | |
for node in doctree.traverse(find_text): | |
text = node.astext() | |
for c in text: | |
if column_width(c) == 1: | |
pageinfo['ascii_count'] += 1 | |
pageinfo['half_char_count'] += 1 | |
pageinfo['full_char_count'] += 0.5 | |
else: | |
pageinfo['nonascii_count'] += 1 | |
pageinfo['half_char_count'] += 2 | |
pageinfo['full_char_count'] += 1 | |
try: | |
lang = langdetect.detect(text) | |
except langdetect.lang_detect_exception.LangDetectException: | |
lang = 'en' | |
if lang == 'en': | |
print('Lang = en:', text) | |
pageinfo['lang_en_count'] += len(text) | |
else: | |
pageinfo['lang_other_count'] += len(text) | |
pageinfo['lang_en_rate'] = ( | |
pageinfo['lang_en_count'] / | |
(pageinfo['lang_other_count'] + pageinfo['lang_en_count']) | |
) | |
pageinfo['char_count'] += len(text) | |
def html_page_context(app, pagename, templatename, context, doctree): | |
if pagename: | |
extras = app.env.domaindata.get(DOMAIN_NAME, {}).get(pagename, {}) | |
context.update(extras) | |
def setup(app): | |
app.connect('doctree-resolved', doctree_resolved) | |
app.connect('html-page-context', html_page_context) |
sphinx | |
langdetect |