Skip to content

Instantly share code, notes, and snippets.

@shimizukawa
Last active December 2, 2017 16:48
Show Gist options
  • Save shimizukawa/0bbccd5c157afd77d5a3abf25a208b8c to your computer and use it in GitHub Desktop.
Save shimizukawa/0bbccd5c157afd77d5a3abf25a208b8c to your computer and use it in GitHub Desktop.
Sphinx拡張 文字数、翻訳率表示パネル pageinfo.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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment