diff options
| author | Nozomu Kaneko <nozom.kaneko@gmail.com> | 2013-02-04 05:59:15 +0900 |
|---|---|---|
| committer | Nozomu Kaneko <nozom.kaneko@gmail.com> | 2013-02-04 05:59:15 +0900 |
| commit | dccff9a754095adeb839299d8fbe93991acbcd25 (patch) | |
| tree | f9bcf7e5dd2de413ddc72fcacdc4bb565c471f34 | |
| parent | 38a9f1a75a12ae3227e65f29f8c5e6a47e39e8e9 (diff) | |
| parent | 0a55b5df70cf79a7bea8ea362f323f3ad2c0280e (diff) | |
| download | sphinx-dccff9a754095adeb839299d8fbe93991acbcd25.tar.gz | |
Merged in knzm/sphinx-fix-docfields-fork (pull request #96)
| -rw-r--r-- | sphinx/environment.py | 21 | ||||
| -rw-r--r-- | sphinx/util/docfields.py | 15 | ||||
| -rw-r--r-- | sphinx/util/nodes.py | 2 | ||||
| -rw-r--r-- | tests/roots/test-intl/contents.txt | 1 | ||||
| -rw-r--r-- | tests/roots/test-intl/docfields.po | 39 | ||||
| -rw-r--r-- | tests/roots/test-intl/docfields.txt | 46 | ||||
| -rw-r--r-- | tests/test_intl.py | 33 |
7 files changed, 151 insertions, 6 deletions
diff --git a/sphinx/environment.py b/sphinx/environment.py index 2995cbbc..de7c26cf 100644 --- a/sphinx/environment.py +++ b/sphinx/environment.py @@ -330,12 +330,31 @@ class Locale(Transform): node['entries'] = new_entries +class RemoveTranslatableInline(Transform): + """ + Remove inline nodes used for translation as placeholders. + """ + default_priority = 999 + + def apply(self): + from sphinx.builders.gettext import MessageCatalogBuilder + env = self.document.settings.env + builder = env.app.builder + if isinstance(builder, MessageCatalogBuilder): + return + for inline in self.document.traverse(nodes.inline): + if 'translatable' in inline: + inline.parent.remove(inline) + inline.parent += inline.children + + class SphinxStandaloneReader(standalone.Reader): """ Add our own transforms. """ transforms = [Locale, CitationReferences, DefaultSubstitutions, - MoveModuleTargets, HandleCodeBlocks, SortIds] + MoveModuleTargets, HandleCodeBlocks, SortIds, + RemoveTranslatableInline] def get_transforms(self): return standalone.Reader.get_transforms(self) + self.transforms diff --git a/sphinx/util/docfields.py b/sphinx/util/docfields.py index 961b09a7..b59d3f31 100644 --- a/sphinx/util/docfields.py +++ b/sphinx/util/docfields.py @@ -67,7 +67,7 @@ class Field(object): fieldname += nodes.Text(' ') fieldname += self.make_xref(self.rolename, domain, fieldarg, nodes.Text) - fieldbody = nodes.field_body('', nodes.paragraph('', '', *content)) + fieldbody = nodes.field_body('', nodes.paragraph('', '', content)) return nodes.field('', fieldname, fieldbody) @@ -255,6 +255,12 @@ class DocFieldTransformer(object): [nodes.Text(argtype)] fieldarg = argname + translatable_content = nodes.inline(fieldbody.rawsource, + translatable=True) + translatable_content.source = fieldbody.parent.source + translatable_content.line = fieldbody.parent.line + translatable_content += content + # grouped entries need to be collected in one entry, while others # get one entry per field if typedesc.is_grouped: @@ -264,10 +270,11 @@ class DocFieldTransformer(object): groupindices[typename] = len(entries) group = [typedesc, []] entries.append(group) - group[1].append(typedesc.make_entry(fieldarg, content)) + entry = typedesc.make_entry(fieldarg, translatable_content) + group[1].append(entry) else: - entries.append([typedesc, - typedesc.make_entry(fieldarg, content)]) + entry = typedesc.make_entry(fieldarg, translatable_content) + entries.append([typedesc, entry]) # step 2: all entries are collected, construct the new field list new_list = nodes.field_list() diff --git a/sphinx/util/nodes.py b/sphinx/util/nodes.py index 1d4d3ba5..5a7749be 100644 --- a/sphinx/util/nodes.py +++ b/sphinx/util/nodes.py @@ -61,7 +61,7 @@ def extract_messages(doctree): if not node.source: continue # built-in message - if isinstance(node, IGNORED_NODES): + if isinstance(node, IGNORED_NODES) and 'translatable' not in node: continue # <field_name>orphan</field_name> # XXX ignore all metadata (== docinfo) diff --git a/tests/roots/test-intl/contents.txt b/tests/roots/test-intl/contents.txt index a08cb0d3..301f58ca 100644 --- a/tests/roots/test-intl/contents.txt +++ b/tests/roots/test-intl/contents.txt @@ -14,3 +14,4 @@ index_entries glossary_terms glossary_terms_inconsistency + docfields diff --git a/tests/roots/test-intl/docfields.po b/tests/roots/test-intl/docfields.po new file mode 100644 index 00000000..f906ca19 --- /dev/null +++ b/tests/roots/test-intl/docfields.po @@ -0,0 +1,39 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2010, Georg Brandl & Team +# This file is distributed under the same license as the Sphinx <Tests> package. +# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Sphinx <Tests> 0.6\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-12-16 14:11\n" +"PO-Revision-Date: 2012-12-18 06:14+0900\n" +"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" +"Language-Team: LANGUAGE <LL@li.org>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +msgid "i18n with docfields" +msgstr "I18N WITH DOCFIELDS" + +msgid "description of parameter param" +msgstr "DESCRIPTION OF PARAMETER param" + +msgid "description of parameter foo" +msgstr "DESCRIPTION OF PARAMETER foo" + +msgid "description of parameter bar" +msgstr "DESCRIPTION OF PARAMETER bar" + +msgid "if the values are not valid" +msgstr "IF THE VALUES ARE NOT VALID" + +msgid "if the values are out of range" +msgstr "IF THE VALUES ARE OUT OF RANGE" + +msgid "a new :class:`Cls3` instance" +msgstr "A NEW :class:`Cls3` INSTANCE" + diff --git a/tests/roots/test-intl/docfields.txt b/tests/roots/test-intl/docfields.txt new file mode 100644 index 00000000..e4dab8e5 --- /dev/null +++ b/tests/roots/test-intl/docfields.txt @@ -0,0 +1,46 @@ +:tocdepth: 2 + +i18n with docfields +=================== + +.. single TypedField + +.. class:: Cls1 + :noindex: + + :param param: description of parameter param + +.. grouped TypedFields + +.. class:: Cls2 + :noindex: + + :param foo: description of parameter foo + :param bar: description of parameter bar + + +.. single GroupedField + +.. class:: Cls3(values) + :noindex: + + :raises ValueError: if the values are out of range + +.. grouped GroupedFields + +.. class:: Cls4(values) + :noindex: + + :raises TypeError: if the values are not valid + :raises ValueError: if the values are out of range + + +.. single Field + +.. class:: Cls5 + :noindex: + + :returns: a new :class:`Cls3` instance + +.. Field is never grouped + diff --git a/tests/test_intl.py b/tests/test_intl.py index 06181c3b..78604e9f 100644 --- a/tests/test_intl.py +++ b/tests/test_intl.py @@ -347,3 +347,36 @@ def test_i18n_index_entries(app): ] for expr in expected_exprs: assert re.search(expr, result, re.M) + + +@with_intl_app(buildername='text', cleanenv=True) +def test_i18n_docfields(app): + app.builder.build(['docfields']) + result = (app.outdir / 'docfields.txt').text(encoding='utf-8') + expect = (u"\nI18N WITH DOCFIELDS" + u"\n*******************\n" + u"\nclass class Cls1\n" + u"\n Parameters:" + u"\n **param** -- DESCRIPTION OF PARAMETER param\n" + u"\nclass class Cls2\n" + u"\n Parameters:" + u"\n * **foo** -- DESCRIPTION OF PARAMETER foo\n" + u"\n * **bar** -- DESCRIPTION OF PARAMETER bar\n" + u"\nclass class Cls3(values)\n" + u"\n Raises ValueError:" + u"\n IF THE VALUES ARE OUT OF RANGE\n" + u"\nclass class Cls4(values)\n" + u"\n Raises:" + u"\n * **TypeError** -- IF THE VALUES ARE NOT VALID\n" + u"\n * **ValueError** -- IF THE VALUES ARE OUT OF RANGE\n" + u"\nclass class Cls5\n" + u"\n Returns:" + u'\n A NEW "Cls3" INSTANCE\n') + assert result == expect + + +@with_intl_app(buildername='html', cleanenv=True) +def test_i18n_docfields_html(app): + app.builder.build(['docfields']) + result = (app.outdir / 'docfields.html').text(encoding='utf-8') + # expect no error by build |
