From 9f85317530b033978221d9561e538b5e8d960471 Mon Sep 17 00:00:00 2001 From: Armin Ronacher Date: Sat, 17 Jan 2009 01:21:47 +0100 Subject: [PATCH 01/38] Autodoc can document classes as functions now if explicitly marked with `autofunction`. --- CHANGES | 3 +++ sphinx/ext/autodoc.py | 13 ++++++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index 6f0ecbd05..600224a63 100644 --- a/CHANGES +++ b/CHANGES @@ -78,6 +78,9 @@ New features added - Autodoc now handles inner classes and their methods. + - Autodoc can document classes as functions now if explicitly + marked with `autofunction`. + - There is now a ``Sphinx.add_lexer()`` method to be able to use custom Pygments lexers easily. diff --git a/sphinx/ext/autodoc.py b/sphinx/ext/autodoc.py index d0512f2be..79443859f 100644 --- a/sphinx/ext/autodoc.py +++ b/sphinx/ext/autodoc.py @@ -324,7 +324,18 @@ class RstGenerator(object): # can never get arguments of a C function or method getargs = False if getargs: - argspec = inspect.getargspec(obj) + try: + argspec = inspect.getargspec(obj) + except TypeError: + # if a class should be documented as function (yay duck + # typing) we try to use the constructor signature as function + # signature without the first argument. + try: + argspec = inspect.getargspec(obj.__new__) + except TypeError: + argspec = inspect.getargspec(obj.__init__) + if argspec[0]: + del argspec[0][0] if what in ('class', 'method', 'staticmethod', 'classmethod') and argspec[0] and \ argspec[0][0] in ('cls', 'self'): From 54c5eb4db099bfc3cbb1cad139522b92badccc47 Mon Sep 17 00:00:00 2001 From: Georg Brandl Date: Mon, 26 Jan 2009 23:11:34 +0100 Subject: [PATCH 02/38] Prevent double hyphens becoming en-dashes in literal code in the LaTeX output. --- CHANGES | 3 +++ sphinx/latexwriter.py | 2 ++ 2 files changed, 5 insertions(+) diff --git a/CHANGES b/CHANGES index 7e343b882..4ce090ac0 100644 --- a/CHANGES +++ b/CHANGES @@ -1,6 +1,9 @@ Release 0.5.2 (in development) ============================== +* Prevent double hyphens becoming en-dashes in literal code in + the LaTeX output. + * Open literalinclude files in universal newline mode to allow arbitrary newline conventions. diff --git a/sphinx/latexwriter.py b/sphinx/latexwriter.py index bfc9165ac..2f871a5cd 100644 --- a/sphinx/latexwriter.py +++ b/sphinx/latexwriter.py @@ -978,7 +978,9 @@ class LaTeXTranslator(nodes.NodeVisitor): raise nodes.SkipNode def visit_literal(self, node): + self.no_contractions += 1 content = self.encode(node.astext().strip()) + self.no_contractions -= 1 if self.in_title: self.body.append(r'\texttt{%s}' % content) elif node.has_key('role') and node['role'] == 'samp': From 2413580d1bfa7f354466a718b549b79fae3ed40f Mon Sep 17 00:00:00 2001 From: Georg Brandl Date: Mon, 26 Jan 2009 23:36:10 +0100 Subject: [PATCH 03/38] Use full path in new toctree entries. --- sphinx/directives/other.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sphinx/directives/other.py b/sphinx/directives/other.py index 0c1e29f9b..a7cdd9047 100644 --- a/sphinx/directives/other.py +++ b/sphinx/directives/other.py @@ -59,7 +59,7 @@ def toctree_directive(name, arguments, options, content, lineno, ret.append(state.document.reporter.warning( 'toctree references unknown document %r' % docname, line=lineno)) else: - entries.append((title, ref)) + entries.append((title, docname)) includefiles.append(docname) else: patname = docname_join(env.docname, entry) From 4e3c3a43fcf35bf110cd35ebe53ee54ac1720ae1 Mon Sep 17 00:00:00 2001 From: Georg Brandl Date: Mon, 26 Jan 2009 23:38:02 +0100 Subject: [PATCH 04/38] The new ``trim_footnote_reference_space`` config value mirrors the docutils config value of the same name and removes the space before a footnote reference that is necessary for reST to recognize the reference. --- CHANGES | 5 +++++ doc/config.rst | 7 +++++++ sphinx/config.py | 1 + sphinx/environment.py | 4 +++- 4 files changed, 16 insertions(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index e37afeda2..4b28899b2 100644 --- a/CHANGES +++ b/CHANGES @@ -64,6 +64,11 @@ New features added - The default value for ``htmlhelp_basename`` is now the project title, cleaned up as a filename. + - The new ``trim_footnote_reference_space`` config value mirrors + the docutils config value of the same name and removes the + space before a footnote reference that is necessary for reST + to recognize the reference. + * Builders: - New builder for Qt help collections, by Antonio Valentino. diff --git a/doc/config.rst b/doc/config.rst index dd25cf223..8fc7978c3 100644 --- a/doc/config.rst +++ b/doc/config.rst @@ -261,7 +261,14 @@ Project information A boolean that decides whether :dir:`moduleauthor` and :dir:`sectionauthor` directives produce any output in the built files. +.. confval:: trim_footnote_reference_space + Trim spaces before footnote references that are necessary for the reST parser + to recognize the footnote, but do not look too nice in the output. + + .. versionadded:: 0.6 + + .. _html-options: Options for HTML output diff --git a/sphinx/config.py b/sphinx/config.py index e1eb8ec8f..a3de68f5a 100644 --- a/sphinx/config.py +++ b/sphinx/config.py @@ -45,6 +45,7 @@ class Config(object): default_role = (None, True), add_function_parentheses = (True, True), add_module_names = (True, True), + trim_footnote_reference_space = (False, True), show_authors = (False, True), pygments_style = ('sphinx', False), highlight_language = ('python', False), diff --git a/sphinx/environment.py b/sphinx/environment.py index a654cb778..991fab72d 100644 --- a/sphinx/environment.py +++ b/sphinx/environment.py @@ -59,7 +59,7 @@ default_settings = { # This is increased every time an environment attribute is added # or changed to properly invalidate pickle files. -ENV_VERSION = 27 +ENV_VERSION = 28 default_substitutions = set([ @@ -517,6 +517,8 @@ class BuildEnvironment: self.docname = docname self.settings['input_encoding'] = self.config.source_encoding + self.settings['trim_footnote_reference_space'] = \ + self.config.trim_footnote_reference_space class SphinxSourceClass(FileInput): def read(self): From 24fc4edb03844bda75b8a85bde99204197cb4268 Mon Sep 17 00:00:00 2001 From: Georg Brandl Date: Thu, 5 Feb 2009 12:47:02 +0100 Subject: [PATCH 05/38] Add Roundup. --- EXAMPLES | 1 + 1 file changed, 1 insertion(+) diff --git a/EXAMPLES b/EXAMPLES index 1f71ea935..d5f477cc4 100644 --- a/EXAMPLES +++ b/EXAMPLES @@ -38,6 +38,7 @@ included, please mail to `the Google group * Python: http://docs.python.org/dev/ * python-apt: http://people.debian.org/~jak/python-apt-doc/ * Reteisi: http://docs.argolinux.org/reteisi/ +* Roundup: http://www.roundup-tracker.org/ * Satchmo: http://www.satchmoproject.com/docs/svn/ * Self: http://selflanguage.org/ * Sphinx: http://sphinx.pocoo.org/ From aff1fe303119056a4253347824ddf07792d8f721 Mon Sep 17 00:00:00 2001 From: Georg Brandl Date: Thu, 5 Feb 2009 13:26:50 +0100 Subject: [PATCH 06/38] Add Pyevolve. --- EXAMPLES | 1 + 1 file changed, 1 insertion(+) diff --git a/EXAMPLES b/EXAMPLES index d5f477cc4..90e91ff39 100644 --- a/EXAMPLES +++ b/EXAMPLES @@ -31,6 +31,7 @@ included, please mail to `the Google group * Paver: http://www.blueskyonmars.com/projects/paver/ * Py on Windows: http://timgolden.me.uk/python-on-windows/ * PyEphem: http://rhodesmill.org/pyephem/ +* Pyevolve: http://pyevolve.sourceforge.net/ * PyPubSub: http://pubsub.sourceforge.net/ * PyUblas: http://tiker.net/doc/pyublas/ * Pylons: http://docs.pylonshq.com/ From bf943483c032dc26009e377c112734864d71a633 Mon Sep 17 00:00:00 2001 From: Armin Ronacher Date: Thu, 5 Feb 2009 13:28:46 +0100 Subject: [PATCH 07/38] attribute documentation now overrides non attribute documentation. This makes it possible to document aliased methods and other things:: def foo(self): pass #: an alias for foo() foo_alias = foo Also attribute documentation can contain paragraphs now. --- sphinx/ext/autodoc.py | 30 +++++++++++++++++++----------- sphinx/util/docstrings.py | 8 ++++++-- 2 files changed, 25 insertions(+), 13 deletions(-) diff --git a/sphinx/ext/autodoc.py b/sphinx/ext/autodoc.py index a817e3433..2727fd6cf 100644 --- a/sphinx/ext/autodoc.py +++ b/sphinx/ext/autodoc.py @@ -359,7 +359,7 @@ class RstGenerator(object): return '' def generate(self, what, name, members, add_content, indent=u'', check_module=False, - no_docstring=False): + no_docstring=False, real_module=None): """ Generate reST for the object in self.result. """ @@ -388,9 +388,17 @@ class RstGenerator(object): (what, str(fullname), err)) return + # if there is no real-module defined figure out which to use. The real module + # is used in the module analyzer to look up the module where the attribute + # documentation would actually be found in. + # This is used for situations where you have a module that collects the + # functions and classes of internal submodules. + if real_module is None: + real_module = getattr(todoc, '__module__', None) or mod + # try to also get a source code analyzer for attribute docs try: - analyzer = ModuleAnalyzer.for_module(mod) + analyzer = ModuleAnalyzer.for_module(real_module) # parse right now, to get PycodeErrors on parsing analyzer.parse() except PycodeError, err: @@ -465,14 +473,13 @@ class RstGenerator(object): sys.getfilesystemencoding(), 'replace') sourcename = u'%s:docstring of %s' % (srcname, fullname) attr_docs = analyzer.find_attr_docs() - if what in ('data', 'attribute'): - key = ('.'.join(objpath[:-1]), objpath[-1]) - if key in attr_docs: - no_docstring = True - docstrings = [attr_docs[key]] - for i, line in enumerate(self.process_doc(docstrings, what, - fullname, todoc)): - self.result.append(indent + line, sourcename, i) + key = ('.'.join(objpath[:-1]), objpath[-1]) + if key in attr_docs: + no_docstring = True + docstrings = [attr_docs[key]] + for i, line in enumerate(self.process_doc(docstrings, what, + fullname, todoc)): + self.result.append(indent + line, sourcename, i) else: sourcename = u'docstring of %s' % fullname attr_docs = {} @@ -605,7 +612,8 @@ class RstGenerator(object): full_membername = mod + '::' + '.'.join(objpath + [membername]) self.generate(memberwhat, full_membername, ['__all__'], add_content=content, no_docstring=bool(content), - indent=indent, check_module=members_check_module) + indent=indent, check_module=members_check_module, + real_module=real_module) self.env.autodoc_current_module = None self.env.autodoc_current_class = None diff --git a/sphinx/util/docstrings.py b/sphinx/util/docstrings.py index 1b0a599a6..ea03340a0 100644 --- a/sphinx/util/docstrings.py +++ b/sphinx/util/docstrings.py @@ -49,8 +49,12 @@ def prepare_commentdoc(s): result = [] lines = [line.strip() for line in s.expandtabs().splitlines()] for line in lines: - if line.startswith('#: '): - result.append(line[3:]) + if line.startswith('#:'): + line = line[2:] + # the first space after the comment is ignored + if line and line[0] == ' ': + line = line[1:] + result.append(line) if result and result[-1]: result.append('') return result From 2b1ed085696776e13019a48fed36c45b62b0393d Mon Sep 17 00:00:00 2001 From: Georg Brandl Date: Fri, 6 Feb 2009 17:41:41 +0100 Subject: [PATCH 08/38] Fix #97: redundant wording. --- doc/concepts.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/concepts.rst b/doc/concepts.rst index 23725b104..a748acad8 100644 --- a/doc/concepts.rst +++ b/doc/concepts.rst @@ -57,8 +57,8 @@ tables of contents. The ``toctree`` directive is the central element. chapter", "previous chapter" and "parent chapter" links. Document titles in the :dir:`toctree` will be automatically read from the - title of the referenced document. If that isn't what you want, you can give - the specify an explicit title and target using a similar syntax to reST + title of the referenced document. If that isn't what you want, you can + specify an explicit title and target using a similar syntax to reST hyperlinks (and Sphinx's :ref:`cross-referencing syntax `). This looks like:: From 9517595c70deaab08588828ad9c06c7dcd174730 Mon Sep 17 00:00:00 2001 From: Georg Brandl Date: Fri, 6 Feb 2009 17:50:24 +0100 Subject: [PATCH 09/38] Add Ukrainian translation, by Stoune. --- CHANGES | 2 + doc/config.rst | 1 + sphinx/locale/uk_UA/LC_MESSAGES/sphinx.js | 1 + sphinx/locale/uk_UA/LC_MESSAGES/sphinx.mo | Bin 0 -> 9801 bytes sphinx/locale/uk_UA/LC_MESSAGES/sphinx.po | 595 ++++++++++++++++++++++ 5 files changed, 599 insertions(+) create mode 100644 sphinx/locale/uk_UA/LC_MESSAGES/sphinx.js create mode 100644 sphinx/locale/uk_UA/LC_MESSAGES/sphinx.mo create mode 100644 sphinx/locale/uk_UA/LC_MESSAGES/sphinx.po diff --git a/CHANGES b/CHANGES index 3ef35a5e4..f390afcbf 100644 --- a/CHANGES +++ b/CHANGES @@ -80,6 +80,8 @@ New features added - Italian by Sandro Dentella. + - Ukrainian by Stoune. + * Extensions and API: - Autodoc now handles documented attributes. diff --git a/doc/config.rst b/doc/config.rst index 8fc7978c3..c59ea01a8 100644 --- a/doc/config.rst +++ b/doc/config.rst @@ -210,6 +210,7 @@ Project information * ``pl`` -- Polish * ``pt_BR`` -- Brazilian Portuguese * ``sl`` -- Slovenian + * ``uk_UA`` -- Ukrainian * ``zh_TW`` -- Traditional Chinese .. confval:: today diff --git a/sphinx/locale/uk_UA/LC_MESSAGES/sphinx.js b/sphinx/locale/uk_UA/LC_MESSAGES/sphinx.js new file mode 100644 index 000000000..d1089bf16 --- /dev/null +++ b/sphinx/locale/uk_UA/LC_MESSAGES/sphinx.js @@ -0,0 +1 @@ +Documentation.addTranslations({"locale": "uk_UA", "plural_expr": "(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)", "messages": {"module, in ": "\u043c\u043e\u0434\u0443\u043b\u044c, \u0432 ", "Preparing search...": "\u041f\u0456\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u0434\u043e \u043f\u043e\u0448\u0443\u043a\u0443...", "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "\u0412\u0430\u0448 \u043f\u043e\u0448\u0443\u043a \u043d\u0435 \u0432\u0438\u044f\u0432\u0438\u0432 \u0436\u043e\u0434\u043d\u043e\u0433\u043e \u0441\u043f\u0456\u0432\u043f\u0430\u0434\u0456\u043d\u043d\u044f. \u0411\u0443\u0434\u044c-\u043b\u0430\u0441\u043a\u0430 \u043f\u0435\u0440\u0435\u043a\u043e\u043d\u0430\u0439\u0442\u0435\u0441\u044f \u0449\u043e \u0432\u0441\u0456 \u0441\u043b\u043e\u0432\u0430 \u043d\u0430\u0431\u0440\u0430\u043d\u0456 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0456 \u0432\u0438 \u043e\u0431\u0440\u0430\u043b\u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u043d\u044c\u043e \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0456\u0439.", "Search finished, found %s page(s) matching the search query.": "\u041f\u043e\u0448\u0443\u043a \u0437\u0430\u043a\u0456\u043d\u0447\u0435\u043d\u043e, \u0437\u043d\u0430\u0439\u0434\u0435\u043d\u043e %s \u0441\u0442\u043e\u0440\u0456\u043d\u043e\u043a \u044f\u043a\u0456 \u0441\u043f\u0456\u0432\u043f\u0430\u043b\u0438 \u0437 \u043f\u043e\u0448\u0443\u043a\u043e\u0432\u0438\u043c \u0437\u0430\u043f\u0438\u0442\u043e\u043c.", ", in ": ", \u0432 ", "Permalink to this headline": "\u041f\u043e\u0441\u0442\u0456\u0439\u043d\u0435 \u043f\u043e\u0441\u0438\u043b\u0430\u043d\u043d\u044f \u043d\u0430 \u0446\u0435\u0439 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a", "Searching": "\u0428\u0443\u043a\u0430\u044e", "Permalink to this definition": "\u041f\u043e\u0441\u0442\u0456\u0439\u043d\u0435 \u043f\u043e\u0441\u0438\u043b\u0430\u043d\u043d\u044f \u043d\u0430 \u0446\u0435 \u0432\u0438\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044f", "Hide Search Matches": "\u041f\u0440\u0438\u0445\u043e\u0432\u0430\u0442\u0438 \u0441\u043f\u0456\u0432\u043f\u0430\u0434\u0456\u043d\u043d\u044f \u043f\u043e\u0448\u0443\u043a\u0443", "Search Results": "\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0438 \u043f\u043e\u0448\u0443\u043a\u0443"}}); \ No newline at end of file diff --git a/sphinx/locale/uk_UA/LC_MESSAGES/sphinx.mo b/sphinx/locale/uk_UA/LC_MESSAGES/sphinx.mo new file mode 100644 index 0000000000000000000000000000000000000000..6677bc576d79307239cb38e7c3149a38f47e0523 GIT binary patch literal 9801 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, 2009. +# +msgid "" +msgstr "" +"Project-Id-Version: Sphinx 0.6\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2008-12-28 23:40+0100\n" +"PO-Revision-Date: 2009-01-14 17:34+0200\n" +"Last-Translator: Petro Sasnyk \n" +"Language-Team: uk_UA \n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 0.9.4\n" + +#: sphinx/environment.py:104 sphinx/writers/latex.py:170 +#, python-format +msgid "%B %d, %Y" +msgstr "" + +#: sphinx/environment.py:300 sphinx/templates/genindex-single.html:2 +#: sphinx/templates/genindex-split.html:2 +#: sphinx/templates/genindex-split.html:5 sphinx/templates/genindex.html:2 +#: sphinx/templates/genindex.html:5 sphinx/templates/genindex.html:48 +#: sphinx/templates/layout.html:126 sphinx/writers/latex.py:176 +msgid "Index" +msgstr "Індекс" + +#: sphinx/environment.py:301 sphinx/writers/latex.py:175 +msgid "Module Index" +msgstr "Індекс модулів" + +#: sphinx/environment.py:302 sphinx/templates/defindex.html:16 +msgid "Search Page" +msgstr "Сторінка пошуку" + +#: sphinx/roles.py:53 sphinx/directives/desc.py:580 +#, python-format +msgid "environment variable; %s" +msgstr "змінна оточення; %s" + +#: sphinx/roles.py:60 +#, python-format +msgid "Python Enhancement Proposals!PEP %s" +msgstr "Python Enhancement Proposals!PEP %s" + +#: sphinx/builders/changes.py:64 +msgid "Builtins" +msgstr "Вбудовані елементи" + +#: sphinx/builders/changes.py:66 +msgid "Module level" +msgstr "Рівень модуля" + +#: sphinx/builders/html.py:118 +#, python-format +msgid "%b %d, %Y" +msgstr "%b %d, %Y" + +#: sphinx/builders/html.py:137 sphinx/templates/defindex.html:21 +msgid "General Index" +msgstr "Загальний індекс" + +#: sphinx/builders/html.py:137 +msgid "index" +msgstr "індекс" + +#: sphinx/builders/html.py:139 sphinx/builders/htmlhelp.py:182 +#: sphinx/builders/qthelp.py:131 sphinx/templates/defindex.html:19 +#: sphinx/templates/modindex.html:2 sphinx/templates/modindex.html:13 +msgid "Global Module Index" +msgstr "Загальний індекс модулів" + +#: sphinx/builders/html.py:139 +msgid "modules" +msgstr "модулі" + +#: sphinx/builders/html.py:179 +msgid "next" +msgstr "наступний" + +#: sphinx/builders/html.py:186 +msgid "previous" +msgstr "попередній" + +#: sphinx/builders/latex.py:155 +msgid " (in " +msgstr " (в " + +#: sphinx/directives/desc.py:25 +#, python-format +msgid "%s() (built-in function)" +msgstr "%s() (вбудована функція)" + +#: sphinx/directives/desc.py:26 sphinx/directives/desc.py:42 +#: sphinx/directives/desc.py:54 +#, python-format +msgid "%s() (in module %s)" +msgstr "%s() (в модулі %s)" + +#: sphinx/directives/desc.py:29 +#, python-format +msgid "%s (built-in variable)" +msgstr "%s (вбудована змінна)" + +#: sphinx/directives/desc.py:30 sphinx/directives/desc.py:78 +#, python-format +msgid "%s (in module %s)" +msgstr "%s (в модулі %s)" + +#: sphinx/directives/desc.py:33 +#, python-format +msgid "%s (built-in class)" +msgstr "%s (вбудований клас)" + +#: sphinx/directives/desc.py:34 +#, python-format +msgid "%s (class in %s)" +msgstr "%s (клас в %s)" + +#: sphinx/directives/desc.py:46 +#, python-format +msgid "%s() (%s.%s method)" +msgstr "%s() (%s.%s метод)" + +#: sphinx/directives/desc.py:48 +#, python-format +msgid "%s() (%s method)" +msgstr "%s() (%s метод)" + +#: sphinx/directives/desc.py:58 +#, python-format +msgid "%s() (%s.%s static method)" +msgstr "%s() (%s.%s статичний метод)" + +#: sphinx/directives/desc.py:60 +#, python-format +msgid "%s() (%s static method)" +msgstr "%s() (%s статичний метод)" + +#: sphinx/directives/desc.py:82 +#, python-format +msgid "%s (%s.%s attribute)" +msgstr "%s (%s.%s атрибут)" + +#: sphinx/directives/desc.py:84 +#, python-format +msgid "%s (%s attribute)" +msgstr "%s (%s атрибут)" + +#: sphinx/directives/desc.py:86 +#, python-format +msgid "%s (C function)" +msgstr "%s (С функція)" + +#: sphinx/directives/desc.py:88 +#, python-format +msgid "%s (C member)" +msgstr "%s (C член)" + +#: sphinx/directives/desc.py:90 +#, python-format +msgid "%s (C macro)" +msgstr "%s (C макрос)" + +#: sphinx/directives/desc.py:92 +#, python-format +msgid "%s (C type)" +msgstr "%s (C тип)" + +#: sphinx/directives/desc.py:94 +#, python-format +msgid "%s (C variable)" +msgstr "%s (C змінна)" + +#: sphinx/directives/desc.py:112 +msgid "Raises" +msgstr "Викликає" + +#: sphinx/directives/desc.py:116 +msgid "Variable" +msgstr "Змінна" + +#: sphinx/directives/desc.py:119 +msgid "Returns" +msgstr "Повертає" + +#: sphinx/directives/desc.py:128 +msgid "Return type" +msgstr "Тип повернення" + +#: sphinx/directives/desc.py:213 +msgid "Parameter" +msgstr "Параметр" + +#: sphinx/directives/desc.py:217 +msgid "Parameters" +msgstr "Параметри" + +#: sphinx/directives/desc.py:465 +#, python-format +msgid "%scommand line option; %s" +msgstr "%sопція командного рядка; %s" + +#: sphinx/directives/other.py:101 +msgid "Platforms: " +msgstr "Платформи: " + +#: sphinx/directives/other.py:106 +#, python-format +msgid "%s (module)" +msgstr "%s (модуль)" + +#: sphinx/directives/other.py:146 +msgid "Section author: " +msgstr "Автор секції: " + +#: sphinx/directives/other.py:148 +msgid "Module author: " +msgstr "Автор модуля: " + +#: sphinx/directives/other.py:150 +msgid "Author: " +msgstr "Автор: " + +#: sphinx/directives/other.py:249 +msgid "See also" +msgstr "Дивись також" + +#: sphinx/ext/autodoc.py:442 +#, python-format +msgid " Bases: %s" +msgstr " Базовий: %s" + +#: sphinx/ext/autodoc.py:563 sphinx/ext/autodoc.py:580 +#, python-format +msgid "alias of :class:`%s`" +msgstr "синонім :class:`%s`" + +#: sphinx/ext/todo.py:31 +msgid "Todo" +msgstr "Доробити" + +#: sphinx/ext/todo.py:75 +#, python-format +msgid "(The original entry is located in %s, line %d and can be found " +msgstr "(Початкове входження знаходиться в %s, рядок %d і може бути знайдений " + +#: sphinx/ext/todo.py:81 +msgid "here" +msgstr "тут" + +#: sphinx/locale/__init__.py:15 +msgid "Attention" +msgstr "Увага" + +#: sphinx/locale/__init__.py:16 +msgid "Caution" +msgstr "Застереження" + +#: sphinx/locale/__init__.py:17 +msgid "Danger" +msgstr "Небезпека" + +#: sphinx/locale/__init__.py:18 +msgid "Error" +msgstr "Помилка" + +#: sphinx/locale/__init__.py:19 +msgid "Hint" +msgstr "Підказка" + +#: sphinx/locale/__init__.py:20 +msgid "Important" +msgstr "Важливо" + +#: sphinx/locale/__init__.py:21 +msgid "Note" +msgstr "Примітка" + +#: sphinx/locale/__init__.py:22 +msgid "See Also" +msgstr "Дивись також" + +#: sphinx/locale/__init__.py:23 +msgid "Tip" +msgstr "Порада" + +#: sphinx/locale/__init__.py:24 +msgid "Warning" +msgstr "Попередження" + +#: sphinx/locale/__init__.py:28 +#, python-format +msgid "New in version %s" +msgstr "Нове в версії %s" + +#: sphinx/locale/__init__.py:29 +#, python-format +msgid "Changed in version %s" +msgstr "Змінено в версії %s" + +#: sphinx/locale/__init__.py:30 +#, python-format +msgid "Deprecated since version %s" +msgstr "Застаріло починаючи з версії %s" + +#: sphinx/locale/__init__.py:34 +msgid "module" +msgstr "модуль" + +#: sphinx/locale/__init__.py:35 +msgid "keyword" +msgstr "ключове слово" + +#: sphinx/locale/__init__.py:36 +msgid "operator" +msgstr "оператор" + +#: sphinx/locale/__init__.py:37 +msgid "object" +msgstr "об'єкт" + +#: sphinx/locale/__init__.py:38 +msgid "exception" +msgstr "виняткова ситуація" + +#: sphinx/locale/__init__.py:39 +msgid "statement" +msgstr "вираз" + +#: sphinx/locale/__init__.py:40 +msgid "built-in function" +msgstr "вбудована функція" + +#: sphinx/static/doctools.js:139 sphinx/writers/html.py:425 +msgid "Permalink to this headline" +msgstr "Постійне посилання на цей заголовок" + +#: sphinx/static/doctools.js:145 sphinx/writers/html.py:80 +msgid "Permalink to this definition" +msgstr "Постійне посилання на це визначення" + +#: sphinx/static/doctools.js:174 +msgid "Hide Search Matches" +msgstr "Приховати співпадіння пошуку" + +#: sphinx/static/searchtools.js:274 +msgid "Searching" +msgstr "Шукаю" + +#: sphinx/static/searchtools.js:279 +msgid "Preparing search..." +msgstr "Підготовка до пошуку..." + +#: sphinx/static/searchtools.js:338 +msgid "module, in " +msgstr "модуль, в " + +#: sphinx/static/searchtools.js:347 +msgid ", in " +msgstr ", в " + +#: sphinx/static/searchtools.js:453 sphinx/templates/search.html:25 +msgid "Search Results" +msgstr "Результати пошуку" + +#: sphinx/static/searchtools.js:455 +msgid "" +"Your search did not match any documents. Please make sure that all words " +"are spelled correctly and that you've selected enough categories." +msgstr "" +"Ваш пошук не виявив жодного співпадіння. Будь-ласка переконайтеся що всі " +"слова набрані правильно і ви обрали достатньо категорій." + +#: sphinx/static/searchtools.js:457 +#, python-format +msgid "Search finished, found %s page(s) matching the search query." +msgstr "Пошук закінчено, знайдено %s сторінок які співпали з пошуковим запитом." + +#: sphinx/templates/defindex.html:2 +msgid "Overview" +msgstr "Огляд" + +#: sphinx/templates/defindex.html:11 +msgid "Indices and tables:" +msgstr "Індекси та таблиці:" + +#: sphinx/templates/defindex.html:14 +msgid "Complete Table of Contents" +msgstr "Повний Зміст" + +#: sphinx/templates/defindex.html:15 +msgid "lists all sections and subsections" +msgstr "перелічити всі секції та підсекції" + +#: sphinx/templates/defindex.html:17 +msgid "search this documentation" +msgstr "шукати цю документацію" + +#: sphinx/templates/defindex.html:20 +msgid "quick access to all modules" +msgstr "швидкий доступ до всіх модулів" + +#: sphinx/templates/defindex.html:22 +msgid "all functions, classes, terms" +msgstr "всі функції, класи, терміни" + +#: sphinx/templates/genindex-single.html:5 +#, python-format +msgid "Index – %(key)s" +msgstr "Індекс – %(key)" + +#: sphinx/templates/genindex-single.html:44 +#: sphinx/templates/genindex-split.html:14 +#: sphinx/templates/genindex-split.html:27 sphinx/templates/genindex.html:54 +msgid "Full index on one page" +msgstr "Повний індекс на одній сторінці" + +#: sphinx/templates/genindex-split.html:7 +msgid "Index pages by letter" +msgstr "Індексні сторінки по символам" + +#: sphinx/templates/genindex-split.html:15 +msgid "can be huge" +msgstr "може бути величезним" + +#: sphinx/templates/layout.html:9 +msgid "Navigation" +msgstr "Навігація" + +#: sphinx/templates/layout.html:40 +msgid "Table Of Contents" +msgstr "Зміст" + +#: sphinx/templates/layout.html:46 +msgid "Previous topic" +msgstr "Попередній розділ" + +#: sphinx/templates/layout.html:48 +msgid "previous chapter" +msgstr "Попередній розділ" + +#: sphinx/templates/layout.html:51 +msgid "Next topic" +msgstr "Наступна тема" + +#: sphinx/templates/layout.html:53 +msgid "next chapter" +msgstr "наступний розділ" + +#: sphinx/templates/layout.html:58 +msgid "This Page" +msgstr "Ця сторінка" + +#: sphinx/templates/layout.html:61 +msgid "Show Source" +msgstr "Відобразити вихідний текст" + +#: sphinx/templates/layout.html:71 +msgid "Quick search" +msgstr "Швидкий пошук" + +#: sphinx/templates/layout.html:74 +msgid "Go" +msgstr "Вперед" + +#: sphinx/templates/layout.html:78 +msgid "Enter search terms or a module, class or function name." +msgstr "Введіть пошуковий термін, модуль, клас чи назву функції." + +#: sphinx/templates/layout.html:115 +#, python-format +msgid "Search within %(docstitle)s" +msgstr "Шукати в %(docstitle)s" + +#: sphinx/templates/layout.html:124 +msgid "About these documents" +msgstr "Про ці документи" + +#: sphinx/templates/layout.html:127 sphinx/templates/search.html:2 +#: sphinx/templates/search.html:5 +msgid "Search" +msgstr "Пошук" + +#: sphinx/templates/layout.html:129 +msgid "Copyright" +msgstr "Авторські права" + +#: sphinx/templates/layout.html:174 +#, python-format +msgid "© Copyright %(copyright)s." +msgstr "© Copyright %(copyright)s." + +#: sphinx/templates/layout.html:176 +#, python-format +msgid "© Copyright %(copyright)s." +msgstr "© Copyright %(copyright)s." + +#: sphinx/templates/layout.html:179 +#, python-format +msgid "Last updated on %(last_updated)s." +msgstr "Востаннє оновлено %(last_updated)s." + +#: sphinx/templates/layout.html:182 +#, python-format +msgid "" +"Created using Sphinx " +"%(sphinx_version)s." +msgstr "" +"Створено з використанням Sphinx " +"%(sphinx_version)s." + +#: sphinx/templates/modindex.html:36 +msgid "Deprecated" +msgstr "Застарілий" + +#: sphinx/templates/opensearch.xml:4 +#, python-format +msgid "Search %(docstitle)s" +msgstr "Пошук %(docstitle)s" + +#: sphinx/templates/search.html:9 +msgid "" +"Please activate JavaScript to enable the search\n" +" functionality." +msgstr "Будь-ласка вімкніть підтримку JavaScript, щоб ввікнути\n" +" пошук." + +#: sphinx/templates/search.html:14 +msgid "" +"From here you can search these documents. Enter your search\n" +" words into the box below and click \"search\". Note that the search\n" +" function will automatically search for all of the words. Pages\n" +" containing fewer words won't appear in the result list." +msgstr "" +"Звідси ви можете шукати ці документи. Введіть ваші пошукові\n" +" слова в поле нижче та натисніть \"пошук\". Зауважте що функція\n" +" пошуку автоматично шукатиме за всіма словами. Сторінки\n" +" що містять менше слів не з'являться в результуючому списку." + +#: sphinx/templates/search.html:21 +msgid "search" +msgstr "пошук" + +#: sphinx/templates/search.html:27 +msgid "Your search did not match any results." +msgstr "Ваш пошук не виявив жодних співпадінь." + +#: sphinx/templates/changes/frameset.html:5 +#: sphinx/templates/changes/versionchanges.html:12 +#, python-format +msgid "Changes in Version %(version)s — %(docstitle)s" +msgstr "Зміни в Версії %(version)s — %(docstitle)" + +#: sphinx/templates/changes/rstsource.html:5 +#, python-format +msgid "%(filename)s — %(docstitle)s" +msgstr "%(filename) — %(docstitle)" + +#: sphinx/templates/changes/versionchanges.html:17 +#, python-format +msgid "Automatically generated list of changes in version %(version)s" +msgstr "Автоматичного згенерований список змін в версії %(version)" + +#: sphinx/templates/changes/versionchanges.html:18 +msgid "Library changes" +msgstr "Зміни в бібліотеці" + +#: sphinx/templates/changes/versionchanges.html:23 +msgid "C API changes" +msgstr "зміни C API" + +#: sphinx/templates/changes/versionchanges.html:25 +msgid "Other changes" +msgstr "Інші зміни" + +#: sphinx/writers/latex.py:173 +msgid "Release" +msgstr "Реліз" + +#: sphinx/writers/text.py:166 +#, python-format +msgid "Platform: %s" +msgstr "Платформа: %s" + +#: sphinx/writers/text.py:427 +msgid "[image]" +msgstr "" + From e15b26866ea3b76f3906f45b79986ac822214e33 Mon Sep 17 00:00:00 2001 From: Georg Brandl Date: Fri, 6 Feb 2009 19:04:14 +0100 Subject: [PATCH 10/38] Add several projects. --- EXAMPLES | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/EXAMPLES b/EXAMPLES index 90e91ff39..625e113e3 100644 --- a/EXAMPLES +++ b/EXAMPLES @@ -7,8 +7,10 @@ included, please mail to `the Google group `_. * APSW: http://apsw.googlecode.com/svn/publish/index.html +* boostmpi: http://documen.tician.de/boostmpi/ * Calibre: http://calibre.kovidgoyal.net/user_manual/ * Chaco: http://code.enthought.com/projects/chaco/docs/html/ +* CodePy: http://documen.tician.de/codepy/ * Cython: http://docs.cython.org/ * Director: http://packages.python.org/director/ * Django: http://docs.djangoproject.com/ @@ -16,11 +18,13 @@ included, please mail to `the Google group * GeoDjango: http://geodjango.org/docs/ * Glashammer: http://glashammer.org/ * Grok: http://grok.zope.org/doc/current/ +* Hedge: http://documen.tician.de/hedge/ * IFM: http://fluffybunny.memebot.com/ifm-docs/index.html * Jinja: http://jinja.pocoo.org/2/documentation/ * MapServer: http://mapserver.osgeo.org/ * Matplotlib: http://matplotlib.sourceforge.net/ * Mayavi: http://code.enthought.com/projects/mayavi/docs/development/html/mayavi +* MeshPy: http://documen.tician.de/meshpy/ * Mixin.com: http://dev.mixin.com/ * mpmath: http://mpmath.googlecode.com/svn/trunk/doc/build/index.html * NetworkX: http://networkx.lanl.gov/ @@ -30,14 +34,17 @@ included, please mail to `the Google group * Paste: http://pythonpaste.org/script/ * Paver: http://www.blueskyonmars.com/projects/paver/ * Py on Windows: http://timgolden.me.uk/python-on-windows/ +* PyCuda: http://documen.tician.de/pycuda/ * PyEphem: http://rhodesmill.org/pyephem/ * Pyevolve: http://pyevolve.sourceforge.net/ -* PyPubSub: http://pubsub.sourceforge.net/ -* PyUblas: http://tiker.net/doc/pyublas/ +* Pylo: http://documen.tician.de/pylo/ * Pylons: http://docs.pylonshq.com/ +* PyPubSub: http://pubsub.sourceforge.net/ +* pyrticle: http://documen.tician.de/pyrticle/ * Pysparse: http://pysparse.sourceforge.net/ * Python: http://docs.python.org/dev/ * python-apt: http://people.debian.org/~jak/python-apt-doc/ +* PyUblas: http://documen.tician.de/pyublas/ * Reteisi: http://docs.argolinux.org/reteisi/ * Roundup: http://www.roundup-tracker.org/ * Satchmo: http://www.satchmoproject.com/docs/svn/ From 1e347aba51a9d63906eea78dd85d462831c0dd40 Mon Sep 17 00:00:00 2001 From: Georg Brandl Date: Fri, 6 Feb 2009 22:18:16 +0100 Subject: [PATCH 11/38] Skip pygments-related tests if it is not installed. --- sphinx/environment.py | 2 -- tests/test_build.py | 27 ++++++++++++++++++--------- tests/test_highlighting.py | 15 +++++++++++---- 3 files changed, 29 insertions(+), 15 deletions(-) diff --git a/sphinx/environment.py b/sphinx/environment.py index 991fab72d..4aa32ed08 100644 --- a/sphinx/environment.py +++ b/sphinx/environment.py @@ -832,8 +832,6 @@ class BuildEnvironment: def get_toctree_for(self, docname, builder): """Return the global TOC nodetree.""" - - # XXX why master_doc? doctree = self.get_doctree(self.config.master_doc) for toctreenode in doctree.traverse(addnodes.toctree): result = self.resolve_toctree(docname, builder, toctreenode, diff --git a/tests/test_build.py b/tests/test_build.py index ed2d9982d..21d829cb8 100644 --- a/tests/test_build.py +++ b/tests/test_build.py @@ -20,6 +20,11 @@ from subprocess import Popen, PIPE from util import * from etree13 import ElementTree as ET +try: + import pygments +except ImportError: + pygments = None + from sphinx.builders.html import StandaloneHTMLBuilder from sphinx.builders.latex import LaTeXBuilder from sphinx.writers.latex import LaTeXTranslator @@ -58,18 +63,9 @@ HTML_XPATH = { ".//img[@src='../_images/img1.png']": '', }, 'includes.html': { - ".//pre/span[@class='s']": u'üöä', ".//pre": u'Max Strauß', ".//a[@href='_downloads/img.png']": '', ".//a[@href='_downloads/img1.png']": '', - ".//div[@class='inc-pyobj1 highlight-text']/div/pre": - r'^class Foo:\n pass\n\s*$', - ".//div[@class='inc-pyobj2 highlight-text']/div/pre": - r'^ def baz\(\):\n pass\n\s*$', - ".//div[@class='inc-lines highlight-text']/div/pre": - r'^class Foo:\n pass\nclass Bar:\n$', - ".//div[@class='inc-startend highlight-text']/div/pre": - ur'^foo = u"Including Unicode characters: üöä"\n$', }, 'autodoc.html': { ".//dt[@id='test_autodoc.Class']": '', @@ -99,6 +95,19 @@ HTML_XPATH = { }, } +if pygments: + HTML_XPATH['includes.html'].update({ + ".//pre/span[@class='s']": u'üöä', + ".//div[@class='inc-pyobj1 highlight-text']/div/pre": + r'^class Foo:\n pass\n\s*$', + ".//div[@class='inc-pyobj2 highlight-text']/div/pre": + r'^ def baz\(\):\n pass\n\s*$', + ".//div[@class='inc-lines highlight-text']/div/pre": + r'^class Foo:\n pass\nclass Bar:\n$', + ".//div[@class='inc-startend highlight-text']/div/pre": + ur'^foo = u"Including Unicode characters: üöä"\n$', + }) + class NslessParser(ET.XMLParser): """XMLParser that throws away namespaces in tag names.""" diff --git a/tests/test_highlighting.py b/tests/test_highlighting.py index 198f7a0a0..ea1f25f14 100644 --- a/tests/test_highlighting.py +++ b/tests/test_highlighting.py @@ -11,6 +11,12 @@ from util import * +try: + import pygments +except ImportError: + from nose.plugins.skip import SkipTest + raise SkipTest('pygments not available') + from pygments.lexer import RegexLexer from pygments.token import Text, Name from pygments.formatters.html import HtmlFormatter @@ -28,16 +34,17 @@ class MyLexer(RegexLexer): ], } -class ComplainOnUnhighlighted(PygmentsBridge): - - def unhighlighted(self, source): - raise AssertionError("should highlight %r" % source) class MyFormatter(HtmlFormatter): def format(self, tokensource, outfile): outfile.write('test') +class ComplainOnUnhighlighted(PygmentsBridge): + def unhighlighted(self, source): + raise AssertionError("should highlight %r" % source) + + @with_app() def test_add_lexer(app): app.add_lexer('test', MyLexer()) From 191440725f01b02e6dbbd43198b9a5d022a116a6 Mon Sep 17 00:00:00 2001 From: Armin Ronacher Date: Fri, 6 Feb 2009 22:25:39 +0100 Subject: [PATCH 12/38] Fixed a bug in autodoc that caused a lot of headaches to the testsuite. --- sphinx/ext/autodoc.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/sphinx/ext/autodoc.py b/sphinx/ext/autodoc.py index 2727fd6cf..aecf343cc 100644 --- a/sphinx/ext/autodoc.py +++ b/sphinx/ext/autodoc.py @@ -473,13 +473,14 @@ class RstGenerator(object): sys.getfilesystemencoding(), 'replace') sourcename = u'%s:docstring of %s' % (srcname, fullname) attr_docs = analyzer.find_attr_docs() - key = ('.'.join(objpath[:-1]), objpath[-1]) - if key in attr_docs: - no_docstring = True - docstrings = [attr_docs[key]] - for i, line in enumerate(self.process_doc(docstrings, what, - fullname, todoc)): - self.result.append(indent + line, sourcename, i) + if objpath: + key = ('.'.join(objpath[:-1]), objpath[-1]) + if key in attr_docs: + no_docstring = True + docstrings = [attr_docs[key]] + for i, line in enumerate(self.process_doc(docstrings, what, + fullname, todoc)): + self.result.append(indent + line, sourcename, i) else: sourcename = u'docstring of %s' % fullname attr_docs = {} From 394282223b4a0baefcb41c5965eac223cad2aa54 Mon Sep 17 00:00:00 2001 From: Georg Brandl Date: Sat, 7 Feb 2009 13:32:47 +0100 Subject: [PATCH 13/38] Patch from Stefan Seefeld: make local toctree collapsible. --- sphinx/builders/html.py | 7 +++++-- sphinx/config.py | 1 + sphinx/directives/other.py | 4 ++-- sphinx/environment.py | 33 +++++++++++++++++++++++++++------ sphinx/util/__init__.py | 2 +- 5 files changed, 36 insertions(+), 11 deletions(-) diff --git a/sphinx/builders/html.py b/sphinx/builders/html.py index 660e63ca6..0b2946ae5 100644 --- a/sphinx/builders/html.py +++ b/sphinx/builders/html.py @@ -164,6 +164,10 @@ class StandaloneHTMLBuilder(Builder): ) self.globalcontext.update(self.config.html_context) + def _get_local_toctree(self, docname): + return self.render_partial(self.env.get_toctree_for( + docname, self, self.config.html_collapse_toctree))['fragment'] + def get_doc_context(self, docname, body, metatags): """Collect items for the template context of a page.""" # find out relations @@ -219,8 +223,6 @@ class StandaloneHTMLBuilder(Builder): metatags = metatags, rellinks = rellinks, sourcename = sourcename, - toctree = self.render_partial(self.env.get_toctree_for( - docname, self))['fragment'], toc = self.render_partial(self.env.get_toc_for(docname))['fragment'], # only display a TOC if there's more than one item to show display_toc = (self.env.toc_num_entries[docname] > 1), @@ -474,6 +476,7 @@ class StandaloneHTMLBuilder(Builder): ctx['pathto'] = pathto ctx['hasdoc'] = lambda name: name in self.env.all_docs ctx['customsidebar'] = self.config.html_sidebars.get(pagename) + ctx['toctree'] = self._get_local_toctree(pagename) ctx.update(addctx) self.app.emit('html-page-context', pagename, templatename, ctx, event_arg) diff --git a/sphinx/config.py b/sphinx/config.py index a3de68f5a..24c3e83f1 100644 --- a/sphinx/config.py +++ b/sphinx/config.py @@ -66,6 +66,7 @@ class Config(object): html_use_smartypants = (True, False), html_translator_class = (None, False), html_sidebars = ({}, False), + html_collapse_toctree = (False, False), html_additional_pages = ({}, False), html_use_modindex = (True, False), html_add_permalinks = (True, False), diff --git a/sphinx/directives/other.py b/sphinx/directives/other.py index a7cdd9047..ab98ee616 100644 --- a/sphinx/directives/other.py +++ b/sphinx/directives/other.py @@ -14,7 +14,7 @@ from docutils.parsers.rst import directives from sphinx import addnodes from sphinx.locale import pairindextypes -from sphinx.util import patfilter, ws_re, caption_ref_re, docname_join +from sphinx.util import patfilter, ws_re, caption_ref_re, url_re, docname_join from sphinx.util.compat import make_admonition @@ -53,7 +53,7 @@ def toctree_directive(name, arguments, options, content, lineno, docname = docname[:-len(suffix)] # absolutize filenames docname = docname_join(env.docname, docname) - if ref.startswith('http://'): # FIXME: generalize to arbitrary xrefs + if url_re.match(ref): entries.append((title, ref)) elif docname not in env.found_docs: ret.append(state.document.reporter.warning( diff --git a/sphinx/environment.py b/sphinx/environment.py index 4aa32ed08..aa5eede6c 100644 --- a/sphinx/environment.py +++ b/sphinx/environment.py @@ -44,7 +44,7 @@ from docutils.transforms.parts import ContentsFilter from sphinx import addnodes from sphinx.util import movefile, get_matching_docs, SEP, ustrftime, \ - docname_join, FilenameUniqDict + docname_join, FilenameUniqDict, url_re from sphinx.directives import additional_xref_types default_settings = { @@ -830,12 +830,12 @@ class BuildEnvironment: node['refuri'] = node['anchorname'] return toc - def get_toctree_for(self, docname, builder): + def get_toctree_for(self, docname, builder, collapse): """Return the global TOC nodetree.""" doctree = self.get_doctree(self.config.master_doc) for toctreenode in doctree.traverse(addnodes.toctree): result = self.resolve_toctree(docname, builder, toctreenode, - prune=True) + prune=True, collapse=collapse) if result is not None: return result @@ -909,7 +909,7 @@ class BuildEnvironment: return doctree def resolve_toctree(self, docname, builder, toctree, prune=True, maxdepth=0, - titles_only=False): + titles_only=False, collapse=False): """ Resolve a *toctree* node into individual bullet lists with titles as items, returning None (if no containing titles are found) or @@ -919,6 +919,8 @@ class BuildEnvironment: to the value of the *maxdepth* option on the *toctree* node. If *titles_only* is True, only toplevel document titles will be in the resulting tree. + If *collapse* is True, all branches not containing docname will + be collapsed. """ if toctree.get('hidden', False): return None @@ -935,13 +937,30 @@ class BuildEnvironment: else: _walk_depth(subnode, depth+1, maxdepth) + # cull sub-entries whose parents aren't 'current' + if (collapse and + depth > 1 and + 'current' not in subnode.parent['classes']): + subnode.parent.remove(subnode) + + elif isinstance(subnode, nodes.reference): + # Identify the toc entry pointing to the current document. + if subnode['refuri'] == docname and not subnode['anchorname']: + # tag the whole branch as 'current' + # (We can't use traverse here as 'ascend' un-intuitively + # implies 'siblings'.) + p = subnode + while p: + p['classes'].append('current') + p = p.parent + def _entries_from_toctree(toctreenode, separate=False, subtree=False): """Return TOC entries for a toctree node.""" refs = [(e[0], str(e[1])) for e in toctreenode['entries']] entries = [] for (title, ref) in refs: try: - if ref.startswith('http://'): # FIXME: (see directives/other.py) + if url_re.match(ref): reference = nodes.reference('', '', refuri=ref, anchorname='', *[nodes.Text(title)]) para = addnodes.compact_paragraph('', '', reference) @@ -1001,11 +1020,13 @@ class BuildEnvironment: newnode = addnodes.compact_paragraph('', '', *tocentries) newnode['toctree'] = True + # prune the tree to maxdepth and replace titles, also set level classes _walk_depth(newnode, 1, prune and maxdepth or 0) + # set the target paths in the toctrees (they are not known at TOC generation time) for refnode in newnode.traverse(nodes.reference): - if not refnode['refuri'].startswith('http://'): # FIXME: see above + if not url_re.match(refnode['refuri']): refnode['refuri'] = builder.get_relative_uri( docname, refnode['refuri']) + refnode['anchorname'] return newnode diff --git a/sphinx/util/__init__.py b/sphinx/util/__init__.py index edfb31d8a..6b64483da 100644 --- a/sphinx/util/__init__.py +++ b/sphinx/util/__init__.py @@ -23,7 +23,7 @@ from os import path # Generally useful regular expressions. ws_re = re.compile(r'\s+') caption_ref_re = re.compile(r'^([^<]+?)\s*<(.+)>$') - +url_re = re.compile(r'(?P.+)://.*') # SEP separates path elements in the canonical file names # From d60aadc13df309a416610d6359138e9ce1e70d9e Mon Sep 17 00:00:00 2001 From: Georg Brandl Date: Sat, 7 Feb 2009 14:13:13 +0100 Subject: [PATCH 14/38] Added a ``toctree`` variable to the templates, and the ability to The new ``html_collapse_toctree`` config value can be used to "collapse" the generated toctree given to the templates. --- CHANGES | 5 ++++- doc/conf.py | 2 ++ doc/config.rst | 8 ++++++++ 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index f390afcbf..48e54fda4 100644 --- a/CHANGES +++ b/CHANGES @@ -49,7 +49,7 @@ New features added - #23: Added a ``classmethod`` directive along with ``method`` and ``staticmethod``. - - Added a toctree variable to the templates, and the ability to + - Added a ``toctree`` variable to the templates, and the ability to include external links in toctrees. * Configuration: @@ -61,6 +61,9 @@ New features added - The new ``html_show_sourcelink`` config value can be used to switch off the links to the reST sources in the sidebar. + - The new ``html_collapse_toctree`` config value can be used to + "collapse" the generated toctree given to the templates. + - The default value for ``htmlhelp_basename`` is now the project title, cleaned up as a filename. diff --git a/doc/conf.py b/doc/conf.py index 709d6f750..c0f8f9a5d 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -82,6 +82,8 @@ html_style = 'sphinxdoc.css' # so a file named "default.css" will overwrite the builtin "default.css". html_static_path = ['_static'] +html_collapse_toctree = True + # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, # using the given strftime format. html_last_updated_fmt = '%b %d, %Y' diff --git a/doc/config.rst b/doc/config.rst index c59ea01a8..4b184b7ae 100644 --- a/doc/config.rst +++ b/doc/config.rst @@ -462,6 +462,14 @@ that use Sphinx' HTMLWriter class. .. versionadded:: 0.4 +.. confval:: html_collapse_toctree + + If true, the toctree given to the templates as ``toctree`` will be collapsed, + i.e. only the subitems that contain the current page are visible. Default is + ``False``. + + .. versionadded:: 0.6 + .. confval:: htmlhelp_basename Output file base name for HTML help builder. Default is ``'pydoc'``. From 350b399c714642ad208a83c760ed2e4ef9430a38 Mon Sep 17 00:00:00 2001 From: Georg Brandl Date: Sat, 7 Feb 2009 19:20:47 +0100 Subject: [PATCH 15/38] Fix an unpacking error on error condition. --- sphinx/ext/autodoc.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sphinx/ext/autodoc.py b/sphinx/ext/autodoc.py index ee45a312b..e8df7c1ca 100644 --- a/sphinx/ext/autodoc.py +++ b/sphinx/ext/autodoc.py @@ -285,7 +285,7 @@ class RstGenerator(object): path, base, args, retann = py_sig_re.match(name).groups() except: self.warn('invalid signature for auto%s (%r)' % (what, name)) - return + return name, name, [], None, None # fullname is the fully qualified name, base the name after the last dot fullname = (path or '') + base From d01410c873aa285e1894ba418895aefc8bd36cef Mon Sep 17 00:00:00 2001 From: Georg Brandl Date: Sat, 7 Feb 2009 19:35:53 +0100 Subject: [PATCH 16/38] Revert accidental debugging leftover. --- doc/conf.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/doc/conf.py b/doc/conf.py index c0f8f9a5d..709d6f750 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -82,8 +82,6 @@ html_style = 'sphinxdoc.css' # so a file named "default.css" will overwrite the builtin "default.css". html_static_path = ['_static'] -html_collapse_toctree = True - # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, # using the given strftime format. html_last_updated_fmt = '%b %d, %Y' From 26ae3f01aa2c80b5885e08432358a1ba72c633ea Mon Sep 17 00:00:00 2001 From: Georg Brandl Date: Sat, 7 Feb 2009 19:41:10 +0100 Subject: [PATCH 17/38] Add a rst_epilog setting, usable for global substitutions. --- CHANGES | 4 ++++ doc/config.rst | 16 ++++++++++++++++ sphinx/config.py | 1 + sphinx/environment.py | 9 ++++++--- tests/root/conf.py | 3 +++ tests/root/markup.txt | 2 ++ tests/test_build.py | 1 + 7 files changed, 33 insertions(+), 3 deletions(-) diff --git a/CHANGES b/CHANGES index 48e54fda4..002740ec1 100644 --- a/CHANGES +++ b/CHANGES @@ -54,6 +54,10 @@ New features added * Configuration: + - The new config value ``rst_epilog`` can contain reST that is + appended to each source file that is read. This is the right + place for global substitutions. + - The new ``html_add_permalinks`` config value can be used to switch off the generated "paragraph sign" permalinks for each heading and definition environment. diff --git a/doc/config.rst b/doc/config.rst index 4b184b7ae..92557beda 100644 --- a/doc/config.rst +++ b/doc/config.rst @@ -141,8 +141,24 @@ General configuration instance is then used to render HTML documents, and possibly the output of other builders (currently the changes builder). +.. confval:: rst_epilog + + .. index:: pair: global; substitutions + + A string of reStructuredText that will be included at the end of every source + file that is read. This is the right place to add substitutions that should + be available in every file. An example:: + + rest_preamble = """ + .. |psf| replace:: Python Software Foundation + """ + + .. versionadded:: 0.6 + .. confval:: default_role + .. index:: default; role + The name of a reST role (builtin or Sphinx extension) to use as the default role, that is, for text marked up ```like this```. This can be set to ``'obj'`` to make ```filter``` a cross-reference to the function "filter". diff --git a/sphinx/config.py b/sphinx/config.py index 24c3e83f1..910069f02 100644 --- a/sphinx/config.py +++ b/sphinx/config.py @@ -52,6 +52,7 @@ class Config(object): templates_path = ([], False), template_bridge = (None, False), keep_warnings = (False, True), + rst_epilog = (None, True), # HTML options html_title = (lambda self: '%s v%s documentation' % diff --git a/sphinx/environment.py b/sphinx/environment.py index aa5eede6c..fccecf07c 100644 --- a/sphinx/environment.py +++ b/sphinx/environment.py @@ -521,13 +521,16 @@ class BuildEnvironment: self.config.trim_footnote_reference_space class SphinxSourceClass(FileInput): - def read(self): - data = FileInput.read(self) + def read(self_): + data = FileInput.read(self_) if app: arg = [data] app.emit('source-read', docname, arg) data = arg[0] - return data + if self.config.rst_epilog: + return data + '\n' + self.config.rst_epilog + '\n' + else: + return data # publish manually pub = Publisher(reader=SphinxStandaloneReader(), diff --git a/tests/root/conf.py b/tests/root/conf.py index 12951d031..8f67a450d 100644 --- a/tests/root/conf.py +++ b/tests/root/conf.py @@ -77,6 +77,9 @@ keep_warnings = True # The name of the Pygments (syntax highlighting) style to use. pygments_style = 'sphinx' +# Global substitutions +rst_epilog = '.. |subst| replace:: global substitution' + # Options for HTML output # ----------------------- diff --git a/tests/root/markup.txt b/tests/root/markup.txt index 777fbd2f7..e01d21526 100644 --- a/tests/root/markup.txt +++ b/tests/root/markup.txt @@ -11,6 +11,8 @@ Testing various markup :author: Me :keywords: docs, sphinx +A |subst|. + .. _label: :: diff --git a/tests/test_build.py b/tests/test_build.py index 21d829cb8..9c8698c45 100644 --- a/tests/test_build.py +++ b/tests/test_build.py @@ -78,6 +78,7 @@ HTML_XPATH = { ".//a[@href='contents.html#ref1']": '', ".//div[@id='label']": '', ".//span[@class='option']": '--help', + ".//p": 'A global substitution.', }, 'desc.html': { ".//dt[@id='mod.Cls.meth1']": '', From 92033eb477a61fc0081b8d85b1b92af154b66e81 Mon Sep 17 00:00:00 2001 From: Georg Brandl Date: Sat, 7 Feb 2009 20:20:08 +0100 Subject: [PATCH 18/38] Fix problems with footnotes in the LaTeX output. --- CHANGES | 2 ++ sphinx/latexwriter.py | 28 +++++++++++++++++++--------- 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/CHANGES b/CHANGES index 4ce090ac0..877046c89 100644 --- a/CHANGES +++ b/CHANGES @@ -1,6 +1,8 @@ Release 0.5.2 (in development) ============================== +* Fix problems with footnotes in the LaTeX output. + * Prevent double hyphens becoming en-dashes in literal code in the LaTeX output. diff --git a/sphinx/latexwriter.py b/sphinx/latexwriter.py index 2f871a5cd..7d5eaa95c 100644 --- a/sphinx/latexwriter.py +++ b/sphinx/latexwriter.py @@ -62,6 +62,9 @@ FOOTER = r''' \end{document} ''' +class collected_footnote(nodes.footnote): + """Footnotes that are collected are assigned this class.""" + class LaTeXWriter(writers.Writer): @@ -273,8 +276,7 @@ class LaTeXTranslator(nodes.NodeVisitor): yield k for fn in footnotes_under(node): num = fn.children[0].astext().strip() - fnotes[num] = fn - fn.parent.remove(fn) + fnotes[num] = [collected_footnote(*fn.children), False] return fnotes def depart_start_of_file(self, node): @@ -535,9 +537,12 @@ class LaTeXTranslator(nodes.NodeVisitor): self.body.append(self.context.pop()) def visit_footnote(self, node): - pass - def depart_footnote(self, node): - pass + raise nodes.SkipNode + + def visit_collected_footnote(self, node): + self.body.append('\\footnote{') + def depart_collected_footnote(self, node): + self.body.append('}') def visit_label(self, node): if isinstance(node.parent, nodes.citation): @@ -992,14 +997,19 @@ class LaTeXTranslator(nodes.NodeVisitor): def visit_footnote_reference(self, node): num = node.astext().strip() try: - fn = self.footnotestack[-1][num] + footnode, used = self.footnotestack[-1][num] except (KeyError, IndexError): raise nodes.SkipNode - self.body.append('\\footnote{') - fn.walkabout(self) + # if a footnote has been inserted once, it shouldn't be repeated + # by the next reference + if used: + self.body.append('\\footnotemark[%s]' % num) + else: + footnode.walkabout(self) + self.footnotestack[-1][num][1] = True raise nodes.SkipChildren def depart_footnote_reference(self, node): - self.body.append('}') + pass def visit_literal_block(self, node): self.verbatim = '' From 36b21d05702d258bc9d22b2b023f98d153024557 Mon Sep 17 00:00:00 2001 From: Georg Brandl Date: Sat, 7 Feb 2009 20:38:56 +0100 Subject: [PATCH 19/38] Clarify what needs to be added to extensions. --- doc/ext/math.rst | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/doc/ext/math.rst b/doc/ext/math.rst index f2664dfe4..87ea220d9 100644 --- a/doc/ext/math.rst +++ b/doc/ext/math.rst @@ -17,8 +17,9 @@ if possible, reuse that support too. .. note:: - :mod:`sphinx.ext.mathbase` does not need to be added to the - :confval:`extensions` config value. + :mod:`sphinx.ext.mathbase` is not meant to be added to the + :confval:`extensions` config value, instead, use either + :mod:`sphinx.ext.pngmath` or :mod:`sphinx.ext.jsmath` as described below. The input language for mathematics is LaTeX markup. This is the de-facto standard for plain-text math notation and has the added advantage that no From 361ed69a3ab667b04084c9cb402b2505b7abce1c Mon Sep 17 00:00:00 2001 From: Georg Brandl Date: Sat, 7 Feb 2009 20:55:27 +0100 Subject: [PATCH 20/38] Don't call LaTeX or dvipng over and over again if it was not found once, and use text-only latex as a substitute in that case. --- CHANGES | 3 +++ sphinx/ext/pngmath.py | 48 ++++++++++++++++++++++++++++--------------- 2 files changed, 34 insertions(+), 17 deletions(-) diff --git a/CHANGES b/CHANGES index 877046c89..a66b9ae2c 100644 --- a/CHANGES +++ b/CHANGES @@ -1,6 +1,9 @@ Release 0.5.2 (in development) ============================== +* Don't call LaTeX or dvipng over and over again if it was not + found once, and use text-only latex as a substitute in that case. + * Fix problems with footnotes in the LaTeX output. * Prevent double hyphens becoming en-dashes in literal code in diff --git a/sphinx/ext/pngmath.py b/sphinx/ext/pngmath.py index dc1d2ee8d..5b7f280a5 100644 --- a/sphinx/ext/pngmath.py +++ b/sphinx/ext/pngmath.py @@ -82,6 +82,11 @@ def render_math(self, math): depth = read_png_depth(outfn) return relfn, depth + # if latex or dvipng has failed once, don't bother to try again + if hasattr(self.builder, '_mathpng_warned_latex') or \ + hasattr(self.builder, '_mathpng_warned_dvipng'): + return None, None + latex = DOC_HEAD + self.builder.config.pngmath_latex_preamble latex += (use_preview and DOC_BODY_PREVIEW or DOC_BODY) % math if isinstance(latex, unicode): @@ -116,12 +121,11 @@ def render_math(self, math): except OSError, err: if err.errno != 2: # No such file or directory raise - if not hasattr(self.builder, '_mathpng_warned_latex'): - self.builder.warn('LaTeX command %r cannot be run (needed for math ' - 'display), check the pngmath_latex setting' % - self.builder.config.pngmath_latex) - self.builder._mathpng_warned_latex = True - return relfn, None + self.builder.warn('LaTeX command %r cannot be run (needed for math ' + 'display), check the pngmath_latex setting' % + self.builder.config.pngmath_latex) + self.builder._mathpng_warned_latex = True + return None, None finally: chdir(curdir) @@ -145,12 +149,11 @@ def render_math(self, math): except OSError, err: if err.errno != 2: # No such file or directory raise - if not hasattr(self.builder, '_mathpng_warned_dvipng'): - self.builder.warn('dvipng command %r cannot be run (needed for math ' - 'display), check the pngmath_dvipng setting' % - self.builder.config.pngmath_dvipng) - self.builder._mathpng_warned_dvipng = True - return relfn, None + self.builder.warn('dvipng command %r cannot be run (needed for math ' + 'display), check the pngmath_dvipng setting' % + self.builder.config.pngmath_dvipng) + self.builder._mathpng_warned_dvipng = True + return None, None stdout, stderr = p.communicate() if p.returncode != 0: raise MathExtError('dvipng exited with error:\n[stderr]\n%s\n[stdout]\n%s' @@ -185,9 +188,15 @@ def html_visit_math(self, node): sm.walkabout(self) self.builder.warn('display latex %r: ' % node['latex'] + str(exc)) raise nodes.SkipNode - self.body.append('%s' % - (fname, self.encode(node['latex']).strip(), - depth and 'style="vertical-align: %dpx" ' % (-depth) or '')) + if fname is None: + # something failed -- use text-only as a bad substitute + self.body.append('%s' % + self.encode(node['latex']).strip()) + else: + self.body.append( + '%s' % + (fname, self.encode(node['latex']).strip(), + depth and 'style="vertical-align: %dpx" ' % (-depth) or '')) raise nodes.SkipNode def html_visit_displaymath(self, node): @@ -207,8 +216,13 @@ def html_visit_displaymath(self, node): self.body.append('

') if node['number']: self.body.append('(%s)' % node['number']) - self.body.append('%s\n' % - (fname, self.encode(node['latex']).strip())) + if fname is None: + # something failed -- use text-only as a bad substitute + self.body.append('%s' % + self.encode(node['latex']).strip()) + else: + self.body.append('%s\n' % + (fname, self.encode(node['latex']).strip())) self.body.append('

') raise nodes.SkipNode From b2c89259ef63bc1e404c4c16fabe9d4fd51b1975 Mon Sep 17 00:00:00 2001 From: Georg Brandl Date: Thu, 12 Feb 2009 12:09:00 +0100 Subject: [PATCH 21/38] Fix todolist crash when no todo entry is there. --- sphinx/ext/todo.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sphinx/ext/todo.py b/sphinx/ext/todo.py index dac906604..c8c6412ce 100644 --- a/sphinx/ext/todo.py +++ b/sphinx/ext/todo.py @@ -61,6 +61,9 @@ def process_todo_nodes(app, doctree, fromdocname): # Augment each todo with a backlink to the original location. env = app.builder.env + if not hasattr(env, 'todo_all_todos'): + env.todo_all_todos = [] + for node in doctree.traverse(todolist): if not app.config['todo_include_todos']: node.replace_self([]) From 5250c2efa963df801a86a02207fd4431d3d3f223 Mon Sep 17 00:00:00 2001 From: Georg Brandl Date: Thu, 12 Feb 2009 12:15:26 +0100 Subject: [PATCH 22/38] Use a new RFC base URL, since rfc.org seems down. --- CHANGES | 5 +++++ sphinx/environment.py | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index a66b9ae2c..fcacf4853 100644 --- a/CHANGES +++ b/CHANGES @@ -1,6 +1,11 @@ Release 0.5.2 (in development) ============================== +* Use a new RFC base URL, since rfc.org seems down. + +* Fix a crash in the todolist directive when no todo items are + defined. + * Don't call LaTeX or dvipng over and over again if it was not found once, and use text-only latex as a substitute in that case. diff --git a/sphinx/environment.py b/sphinx/environment.py index a609544e1..bc5b35042 100644 --- a/sphinx/environment.py +++ b/sphinx/environment.py @@ -49,7 +49,7 @@ default_settings = { 'embed_stylesheet': False, 'cloak_email_addresses': True, 'pep_base_url': 'http://www.python.org/dev/peps/', - 'rfc_base_url': 'http://rfc.net/', + 'rfc_base_url': 'http://tools.ietf.org/html/', 'input_encoding': 'utf-8', 'doctitle_xform': False, 'sectsubtitle_xform': False, From 1b283a49c584c037285e0b8dcfc8b87bb2a8c5dd Mon Sep 17 00:00:00 2001 From: Georg Brandl Date: Thu, 12 Feb 2009 12:46:25 +0100 Subject: [PATCH 23/38] Use better error messages for unsupported markup in LaTeX documents. --- sphinx/application.py | 19 +++++++++++-------- sphinx/builder.py | 5 +++-- sphinx/environment.py | 2 +- sphinx/latexwriter.py | 23 +++++++++++++++++------ 4 files changed, 32 insertions(+), 17 deletions(-) diff --git a/sphinx/application.py b/sphinx/application.py index ecc2037ad..ba066d5f0 100644 --- a/sphinx/application.py +++ b/sphinx/application.py @@ -19,14 +19,8 @@ from cStringIO import StringIO from docutils import nodes from docutils.parsers.rst import directives, roles -import sphinx -from sphinx.roles import xfileref_role, innernodetypes -from sphinx.config import Config -from sphinx.builder import builtin_builders, StandaloneHTMLBuilder -from sphinx.directives import desc_directive, target_directive, additional_xref_types -from sphinx.environment import SphinxStandaloneReader -from sphinx.util.console import bold - +# create the error classes before importing the rest of Sphinx, so that +# they can be imported in a circular fashion class SphinxError(Exception): """ @@ -56,6 +50,15 @@ class ExtensionError(SphinxError): return parent_str +import sphinx +from sphinx.roles import xfileref_role, innernodetypes +from sphinx.config import Config +from sphinx.builder import builtin_builders, StandaloneHTMLBuilder +from sphinx.directives import desc_directive, target_directive, additional_xref_types +from sphinx.environment import SphinxStandaloneReader +from sphinx.util.console import bold + + # List of all known core events. Maps name to arguments description. events = { 'builder-inited': '', diff --git a/sphinx/builder.py b/sphinx/builder.py index 7b45f973e..13f96e6d6 100644 --- a/sphinx/builder.py +++ b/sphinx/builder.py @@ -36,6 +36,7 @@ from sphinx.environment import BuildEnvironment, NoUri from sphinx.highlighting import PygmentsBridge from sphinx.util.console import bold, purple, darkgreen from sphinx.search import js_index +from sphinx.application import SphinxError try: import json @@ -902,7 +903,6 @@ class JSONHTMLBuilder(SerializingHTMLBuilder): def init(self): if json is None: - from sphinx.application import SphinxError raise SphinxError('The module simplejson (or json in Python >= 2.6) ' 'is not available. The JSONHTMLBuilder builder ' 'will not work.') @@ -1030,7 +1030,7 @@ class LaTeXBuilder(Builder): self.warn('%s: toctree contains ref to nonexisting file %r' % (docname, includefile)) else: - sof = addnodes.start_of_file() + sof = addnodes.start_of_file(file=includefile) sof.children = subtree.children newnodes.append(sof) toctreenode.parent.replace(toctreenode, newnodes) @@ -1047,6 +1047,7 @@ class LaTeXBuilder(Builder): tree = new_tree largetree = process_tree(indexfile, tree) largetree.extend(appendices) + largetree['file'] = indexfile self.info() self.info("resolving references...") self.env.resolve_references(largetree, indexfile, self) diff --git a/sphinx/environment.py b/sphinx/environment.py index bc5b35042..73e5205e5 100644 --- a/sphinx/environment.py +++ b/sphinx/environment.py @@ -44,6 +44,7 @@ from docutils.transforms.parts import ContentsFilter from sphinx import addnodes from sphinx.util import movefile, get_matching_docs, SEP, ustrftime from sphinx.directives import additional_xref_types +from sphinx.application import SphinxError default_settings = { 'embed_stylesheet': False, @@ -542,7 +543,6 @@ class BuildEnvironment: pub.publish() doctree = pub.document except UnicodeError, err: - from sphinx.application import SphinxError raise SphinxError(err.message) self.filter_messages(doctree) self.process_dependencies(docname, doctree) diff --git a/sphinx/latexwriter.py b/sphinx/latexwriter.py index 7d5eaa95c..b6b5e823c 100644 --- a/sphinx/latexwriter.py +++ b/sphinx/latexwriter.py @@ -22,6 +22,7 @@ from docutils.writers.latex2e import Babel from sphinx import addnodes from sphinx import highlighting from sphinx.locale import admonitionlabels, versionlabels +from sphinx.application import SphinxError from sphinx.util import ustrftime from sphinx.util.texescape import tex_escape_map from sphinx.util.smartypants import educateQuotesLatex @@ -65,6 +66,9 @@ FOOTER = r''' class collected_footnote(nodes.footnote): """Footnotes that are collected are assigned this class.""" +class UnsupportedError(SphinxError): + category = 'Markup is unsupported in LaTeX' + class LaTeXWriter(writers.Writer): @@ -209,6 +213,7 @@ class LaTeXTranslator(nodes.NodeVisitor): self.highlightlinenothreshold = sys.maxint self.written_ids = set() self.footnotestack = [] + self.curfilestack = [] if self.elements['docclass'] == 'manual': if builder.config.latex_use_parts: self.top_sectionlevel = 0 @@ -232,6 +237,7 @@ class LaTeXTranslator(nodes.NodeVisitor): def visit_document(self, node): self.footnotestack.append(self.collect_footnotes(node)) + self.curfilestack.append(node['file']) if self.first_document == 1: # the first document is all the regular content ... self.body.append(BEGIN_DOC % self.elements) @@ -262,6 +268,7 @@ class LaTeXTranslator(nodes.NodeVisitor): self.body.append('\n\\resetcurrentobjects\n') # and also, new footnotes self.footnotestack.append(self.collect_footnotes(node)) + self.curfilestack.append(node['file']) def collect_footnotes(self, node): fnotes = {} @@ -281,6 +288,7 @@ class LaTeXTranslator(nodes.NodeVisitor): def depart_start_of_file(self, node): self.footnotestack.pop() + self.curfilestack.pop() def visit_highlightlang(self, node): self.highlightlang = node['lang'] @@ -360,9 +368,10 @@ class LaTeXTranslator(nodes.NodeVisitor): try: self.body.append(r'\%s{' % self.sectionnames[self.sectionlevel]) except IndexError: - from sphinx.application import SphinxError - raise SphinxError('too many nesting section levels for LaTeX, ' - 'at heading: %s' % node.astext()) + raise UnsupportedError( + '%s:%s: too many nesting section levels for ' + 'LaTeX, at heading: %s' % (self.curfilestack[-1], + node.line or '', node.astext())) self.context.append('}\n') elif isinstance(parent, (nodes.topic, nodes.sidebar)): self.body.append(r'\textbf{') @@ -555,7 +564,8 @@ class LaTeXTranslator(nodes.NodeVisitor): def visit_table(self, node): if self.table: - raise NotImplementedError('Nested tables are not supported.') + raise UnsupportedError('%s:%s: nested tables are not yet implemented.' % + (self.curfilestack[-1], node.line or '')) self.table = Table() self.tablebody = [] # Redirect body output until table is finished. @@ -621,8 +631,9 @@ class LaTeXTranslator(nodes.NodeVisitor): def visit_entry(self, node): if node.has_key('morerows') or node.has_key('morecols'): - raise NotImplementedError('Column or row spanning cells are ' - 'not implemented.') + raise UnsupportedError('%s:%s: column or row spanning cells are ' + 'not yet implemented.' % + (self.curfilestack[-1], node.line or '')) if self.table.col > 0: self.body.append(' & ') self.table.col += 1 From 5e1448361f965f947d6bf9a428cfb992decd04e6 Mon Sep 17 00:00:00 2001 From: Georg Brandl Date: Thu, 12 Feb 2009 12:50:42 +0100 Subject: [PATCH 24/38] Add FAQ, to be expanded. --- doc/contents.rst | 3 ++- doc/faq.rst | 20 ++++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 doc/faq.rst diff --git a/doc/contents.rst b/doc/contents.rst index 6ddbcbcbb..c4fb107bd 100644 --- a/doc/contents.rst +++ b/doc/contents.rst @@ -14,7 +14,8 @@ Sphinx documentation contents config templating extensions - + + faq glossary changes examples diff --git a/doc/faq.rst b/doc/faq.rst new file mode 100644 index 000000000..d447602fc --- /dev/null +++ b/doc/faq.rst @@ -0,0 +1,20 @@ +.. _faq: + +Sphinx FAQ +========== + +This is a list of Frequently Asked Questions about Sphinx. Feel free to +suggest new entries! + +How do I... +----------- + +... add global substitutions? + Add them in the :confval:`rst_epilog` config value. + +... use Sphinx with Epydoc? + There's a third-party extension providing an `api role`_ which refers to + Epydoc's API docs for a given identifier. + + +.. _api role: http://git.savannah.gnu.org/cgit/kenozooid.git/tree/doc/extapi.py From d748c6d35e600fc633105ac0309e8a273f13cd74 Mon Sep 17 00:00:00 2001 From: Georg Brandl Date: Sat, 14 Feb 2009 11:28:07 +0100 Subject: [PATCH 25/38] Add file attribute to appendix nodes. --- sphinx/builder.py | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/sphinx/builder.py b/sphinx/builder.py index 13f96e6d6..7b1f8bb14 100644 --- a/sphinx/builder.py +++ b/sphinx/builder.py @@ -979,11 +979,6 @@ class LaTeXBuilder(Builder): self.titles.append((docname, entry[2])) def write(self, *ignored): - # first, assemble the "appendix" docs that are in every PDF - appendices = [] - for fname in self.config.latex_appendices: - appendices.append(self.env.get_doctree(fname)) - docwriter = LaTeXWriter(self) docsettings = OptionParser( defaults=self.env.settings, @@ -1001,7 +996,8 @@ class LaTeXBuilder(Builder): encoding='utf-8') self.info("processing " + targetname + "... ", nonl=1) doctree = self.assemble_doctree(docname, toctree_only, - appendices=(docclass == 'manual') and appendices or []) + appendices=((docclass == 'manual') and + self.config.latex_appendices or [])) self.post_process_images(doctree) self.info("writing... ", nonl=1) doctree.settings = docsettings @@ -1046,8 +1042,11 @@ class LaTeXBuilder(Builder): new_sect += node tree = new_tree largetree = process_tree(indexfile, tree) - largetree.extend(appendices) largetree['file'] = indexfile + for docname in appendices: + appendix = self.env.get_doctree(docname) + appendix['file'] = docname + largetree.append(appendix) self.info() self.info("resolving references...") self.env.resolve_references(largetree, indexfile, self) From 012e7f2d79acf4071d2b25a8ba6cf50e98c90857 Mon Sep 17 00:00:00 2001 From: Georg Brandl Date: Sat, 14 Feb 2009 11:38:28 +0100 Subject: [PATCH 26/38] Fix handling of "docname" and target names in LaTeX builder. --- sphinx/builders/latex.py | 18 +++++++++++------- sphinx/writers/latex.py | 4 ++-- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/sphinx/builders/latex.py b/sphinx/builders/latex.py index 3b7b0c196..395ccd9db 100644 --- a/sphinx/builders/latex.py +++ b/sphinx/builders/latex.py @@ -52,6 +52,10 @@ class LaTeXBuilder(Builder): else: return '%' + docname + def get_relative_uri(self, from_, to, typ=None): + # ignore source path + return self.get_target_uri(to, typ) + def init_document_data(self): preliminary_document_data = map(list, self.config.latex_documents) if not preliminary_document_data: @@ -72,11 +76,6 @@ class LaTeXBuilder(Builder): self.titles.append((docname, entry[2])) def write(self, *ignored): - # first, assemble the "appendix" docs that are in every PDF - appendices = [] - for fname in self.config.latex_appendices: - appendices.append(self.env.get_doctree(fname)) - docwriter = LaTeXWriter(self) docsettings = OptionParser( defaults=self.env.settings, @@ -94,7 +93,8 @@ class LaTeXBuilder(Builder): encoding='utf-8') self.info("processing " + targetname + "... ", nonl=1) doctree = self.assemble_doctree(docname, toctree_only, - appendices=(docclass == 'manual') and appendices or []) + appendices=((docclass == 'manual') and + self.config.latex_appendices or [])) self.post_process_images(doctree) self.info("writing... ", nonl=1) doctree.settings = docsettings @@ -140,7 +140,11 @@ class LaTeXBuilder(Builder): new_sect += node tree = new_tree largetree = process_tree(indexfile, tree) - largetree.extend(appendices) + largetree['docname'] = indexfile + for docname in appendices: + appendix = self.env.get_doctree(docname) + appendix['docname'] = docname + largetree.append(appendix) self.info() self.info("resolving references...") self.env.resolve_references(largetree, indexfile, self) diff --git a/sphinx/writers/latex.py b/sphinx/writers/latex.py index e1fbea133..057e229b4 100644 --- a/sphinx/writers/latex.py +++ b/sphinx/writers/latex.py @@ -239,7 +239,7 @@ class LaTeXTranslator(nodes.NodeVisitor): def visit_document(self, node): self.footnotestack.append(self.collect_footnotes(node)) - self.curfilestack.append(node['file']) + self.curfilestack.append(node['docname']) if self.first_document == 1: # the first document is all the regular content ... self.body.append(BEGIN_DOC % self.elements) @@ -274,7 +274,7 @@ class LaTeXTranslator(nodes.NodeVisitor): self.footnotestack.append(self.collect_footnotes(node)) # also add a document target self.body.append('\\hypertarget{--doc-%s}{}' % node['docname']) - self.curfilestack.append(node['file']) + self.curfilestack.append(node['docname']) def collect_footnotes(self, node): fnotes = {} From 15cff64791e347bf0ea6d88a8370204f1e19d112 Mon Sep 17 00:00:00 2001 From: Georg Brandl Date: Sat, 14 Feb 2009 13:05:36 +0100 Subject: [PATCH 27/38] Make the "toctree" context item a callable. --- sphinx/builders/html.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sphinx/builders/html.py b/sphinx/builders/html.py index 3b3abaa8b..59cadde24 100644 --- a/sphinx/builders/html.py +++ b/sphinx/builders/html.py @@ -477,7 +477,7 @@ class StandaloneHTMLBuilder(Builder): ctx['pathto'] = pathto ctx['hasdoc'] = lambda name: name in self.env.all_docs ctx['customsidebar'] = self.config.html_sidebars.get(pagename) - ctx['toctree'] = self._get_local_toctree(pagename) + ctx['toctree'] = lambda: self._get_local_toctree(pagename) ctx.update(addctx) self.app.emit('html-page-context', pagename, templatename, ctx, event_arg) From 39f1980dc0e98b524bdd8e633d82ef45bbfe8cdf Mon Sep 17 00:00:00 2001 From: Georg Brandl Date: Sat, 14 Feb 2009 13:38:09 +0100 Subject: [PATCH 28/38] Make builds 20-25% faster by supplying custom versions of node.traverse(). --- sphinx/util/__init__.py | 36 ++++++++++++++++++++++++++++++++++++ sphinx/writers/latex.py | 2 +- 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/sphinx/util/__init__.py b/sphinx/util/__init__.py index 6b64483da..75707d89c 100644 --- a/sphinx/util/__init__.py +++ b/sphinx/util/__init__.py @@ -13,6 +13,7 @@ import os import re import sys import time +import types import fnmatch import tempfile import posixpath @@ -371,3 +372,38 @@ def movefile(source, dest): except OSError: pass os.rename(source, dest) + + +# monkey-patch Node.traverse + +def _all_traverse(self): + """Version of Node.traverse() that doesn't need a condition.""" + result = [] + result.append(self) + for child in self.children: + result.extend(child._all_traverse()) + return result + +def _fast_traverse(self, cls): + """Version of Node.traverse() that only supports instance checks.""" + result = [] + if isinstance(self, cls): + result.append(self) + for child in self.children: + result.extend(child._fast_traverse(cls)) + return result + +def _new_traverse(self, condition=None, + include_self=1, descend=1, siblings=0, ascend=0): + if include_self and descend and not siblings and not ascend: + if condition is None: + return self._all_traverse() + elif isinstance(condition, (types.ClassType, type)): + return self._fast_traverse(condition) + return self._old_traverse(condition, include_self, descend, siblings, ascend) + +import docutils.nodes +docutils.nodes.Node._old_traverse = docutils.nodes.Node.traverse +docutils.nodes.Node._all_traverse = _all_traverse +docutils.nodes.Node._fast_traverse = _fast_traverse +docutils.nodes.Node.traverse = _new_traverse diff --git a/sphinx/writers/latex.py b/sphinx/writers/latex.py index 057e229b4..7fa21fc6b 100644 --- a/sphinx/writers/latex.py +++ b/sphinx/writers/latex.py @@ -239,7 +239,7 @@ class LaTeXTranslator(nodes.NodeVisitor): def visit_document(self, node): self.footnotestack.append(self.collect_footnotes(node)) - self.curfilestack.append(node['docname']) + self.curfilestack.append(node.get('docname', '')) if self.first_document == 1: # the first document is all the regular content ... self.body.append(BEGIN_DOC % self.elements) From a0fa7791368cbe1c9d9f81c64ed082ef4cacce2a Mon Sep 17 00:00:00 2001 From: Georg Brandl Date: Sat, 14 Feb 2009 13:48:07 +0100 Subject: [PATCH 29/38] Warn if a static path dir doesn't exist. --- sphinx/builders/html.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sphinx/builders/html.py b/sphinx/builders/html.py index 59cadde24..d2bd5e019 100644 --- a/sphinx/builders/html.py +++ b/sphinx/builders/html.py @@ -392,6 +392,9 @@ class StandaloneHTMLBuilder(Builder): [path.join(self.confdir, spath) for spath in self.config.html_static_path] for staticdirname in staticdirnames: + if not path.isdir(staticdirname): + self.warn('static directory %r does not exist' % staticdirname) + continue for filename in os.listdir(staticdirname): if filename.startswith('.'): continue From 143cf90787f556d321126ba3c65dd2837a2324f9 Mon Sep 17 00:00:00 2001 From: Georg Brandl Date: Sat, 14 Feb 2009 15:09:45 +0100 Subject: [PATCH 30/38] Add Finnish translation by Jukka Inkeri. --- CHANGES | 4 +- doc/config.rst | 1 + sphinx/locale/cs/LC_MESSAGES/sphinx.mo | Bin 8268 -> 7816 bytes sphinx/locale/de/LC_MESSAGES/sphinx.js | 2 +- sphinx/locale/de/LC_MESSAGES/sphinx.mo | Bin 7111 -> 8058 bytes sphinx/locale/es/LC_MESSAGES/sphinx.mo | Bin 6617 -> 6809 bytes sphinx/locale/fi/LC_MESSAGES/sphinx.js | 1 + sphinx/locale/fi/LC_MESSAGES/sphinx.mo | Bin 0 -> 7537 bytes sphinx/locale/fi/LC_MESSAGES/sphinx.po | 600 ++++++++++++++++++++++ sphinx/locale/fr/LC_MESSAGES/sphinx.mo | Bin 7324 -> 7516 bytes sphinx/locale/it/LC_MESSAGES/sphinx.mo | Bin 7944 -> 8136 bytes sphinx/locale/ja/LC_MESSAGES/sphinx.mo | Bin 7345 -> 7537 bytes sphinx/locale/nl/LC_MESSAGES/sphinx.mo | Bin 6882 -> 7074 bytes sphinx/locale/pl/LC_MESSAGES/sphinx.mo | Bin 6982 -> 7174 bytes sphinx/locale/pt_BR/LC_MESSAGES/sphinx.mo | Bin 7280 -> 7472 bytes sphinx/locale/sl/LC_MESSAGES/sphinx.mo | Bin 7016 -> 7208 bytes sphinx/locale/uk_UA/LC_MESSAGES/sphinx.mo | Bin 9801 -> 9801 bytes sphinx/locale/zh_TW/LC_MESSAGES/sphinx.mo | Bin 7368 -> 7560 bytes 18 files changed, 606 insertions(+), 2 deletions(-) create mode 100644 sphinx/locale/fi/LC_MESSAGES/sphinx.js create mode 100644 sphinx/locale/fi/LC_MESSAGES/sphinx.mo create mode 100644 sphinx/locale/fi/LC_MESSAGES/sphinx.po diff --git a/CHANGES b/CHANGES index 7209b3b5d..d0ff30d50 100644 --- a/CHANGES +++ b/CHANGES @@ -87,7 +87,9 @@ New features added - Italian by Sandro Dentella. - - Ukrainian by Stoune. + - Ukrainian by Petro Sasnyk. + + - Finnish by Jukka Inkeri. * Extensions and API: diff --git a/doc/config.rst b/doc/config.rst index 92557beda..a0151dda3 100644 --- a/doc/config.rst +++ b/doc/config.rst @@ -220,6 +220,7 @@ Project information * ``de`` -- German * ``en`` -- English * ``es`` -- Spanish + * ``fi`` -- Finnish * ``fr`` -- French * ``it`` -- Italian * ``nl`` -- Dutch diff --git a/sphinx/locale/cs/LC_MESSAGES/sphinx.mo b/sphinx/locale/cs/LC_MESSAGES/sphinx.mo index 9178448d85ccc0717a977269bc40ef62b6205044..3dccc2b971f28b6896a8af71921927e166c983d8 100644 GIT binary patch delta 2299 zcmb8ve@xVM9LMp`7s2E3I5-M^FKcBERNcKlQKT;WRBx_!(8ISyYLypcYuL?E<3J z`x4Y8t3?1yrU1 zuCgLuj{2U*ES73krUYQ{CFBke+7nO^kj``^ujO1=*_ z;47$&&Y~j!9+lBW)WpkJkNNyBbp6ty0&K?}*o#Ww6l(tG$P_byI^s)s8fP%9?|+ON zp$yKU&S(mCM)Rl)9MaTTuS6}p8nsXZDxhYhXyyUbMm<=KyKVm)sDwU11^fl7vfp7! zXFAP;&gKu)87?9n-H8Bl@l6ml?l#-sh&sa-ynYm@dBdmxM^N8;1~qOHwc%CN=blfN z3bZCj{Z;yV=+FjRk*b&-s0zeUfh27I9@NAPDx)#1!B0_@nnA5s$p1zPXenxbm9^IP zuSZpIbBOwD;8r?xIUYrox)XJF-PWh@1=_n%NA;KO_mRFzUyk}pYEbXDp^l~-N!si} zC74F-a}X84p%f1)%~5pmgncoInlOc`#3fW_zoEuovHc$Es|@|9(pR7Ysz#N118ROJ zDv(~(x+yfS>w4RwiC7}yu1aJ>`E5B_&ypc0d&GClNk8uINPpvhvnn2Agd6Qi_6Au0Fn;dXs{n74tEbSInERM$elF!y<2a7g2>Dl7TC4JF^JMe@X>4`@Z ziAdL~L|1kyaMCGgsI6~w>+gs(t;-%N-RbxU;${rGHi!HdC2)(k;P(^q0Zo Y|2KwYsNYG4!{3$>(|@Cw4R<>K0x#qQN&o-= delta 2799 zcmYk+Yitx%7{>9lfO4tOQVYnXa6sf@3Q}l@mQsx<5m7)9FXf`s?zFq@?o6GXEi9U> z8Wlr8Ll!=038n-iw~E>ri6%r@NbnYKB!+}2L4|%2iF}Zt=>KWQNVDDFoHOV0p7)*E zR~CMGSN_NHK|2h8&+$J&|AY9t=5N9fW3HoJiBs@q9Eyu0SKvt64OoFGEXC*X2Hb|j zaTk{0!RY>BywRAvIl;wfZk)z4`~$V%Aa>D&(Ww3@I0ok-6U|Z_hfm^7xH0N4;8@yk z<9z%SC*hxXC*Cxy|3Hu9UiLTZxERHa!R*EuQ;Ec2rei(MiP}EuBpYxrzKojpD%Rj0 zR6wUt>s-R+conb5Wu$|x%qkp@PvLa-H_vjR6z@S3GiE<3BL~<`8y@9LC;kQp;4e}8 zJgQn(P#c;N{p$=v1y&Y04K=?G`Ir@aO~xlN-&ZRxwD&etdsozc2er`0sK~!XmF9HR z{tXqtWh4f36_vRgSVZGTp`Iy=%FII4K93_wF>WdOS7cAq!Cdna-i+I$frnA4JB~{E zm#B#+qxPBTelP0byAa(U!~>)C%CHV6p;EpEm8lKL$GlKR{uOb7mfVTj;4Peu@1Yht zgF5*I)B-UY1F-~^fl}1`3RIw#xEXK3Y4~o`{{vRi{t5Y*zw>-+!_xBpr+7SSgBsMr z^{8iK5o+NjsMqizRAxfd{AZ&3n^5y!L#28Q4fWIEh;43@Wg5 zsFM7J9Nvs%5%tf&{8TRLxzKM#$6Q2ZVkoO> zqcT+gIMlqkr~@s*DqM@o*k;sv`zy)6B6*(v;YHYUdGOr> z@^zUo@V%D$Wq#<^*4-Ah>=S<02JX{YHxs&X>v-1BhO_+US#c+H?W%_#u+4#=wqYWf zu^Bh$aD&eO7FyZzc=0J1uUN zZOn!?8QQdyvz{N?MwVhmkZehW*7w}mJ+;Hu$EJCq8(7Dt{dhLTq^6XU$yh(I%~`Lh zZ&lApGxktPcWlH`H@Dso;sodfO^L$l;cG`d=x0LP?zd-CP7p1UsV#gse0R^z5qHMw zRwn%Q|8=uzDrcPzCz)~@Q!Y&flyPl)$_bnOAe}KQvn?$o$Sz7aUQ6Lr>7|~tWgoQX&m9LHsn9))AXYegOb1G{7PxlIcqgU)ow>j73d}SCEySz51%C>Pz zvX)4>@nToVIX&0ikj#YHR(Ez?V^F`+bB-TLrjoWblXf|u^_u?m$ZTCCec#0e3s%i9#v6&4{+-Eb@m@6SNC%7({Z zFLuYNhui2Y!);9rKR0H3Y}9>yk!gcC>$Rnd-N&}Nh1}Toac*m0dW&6wcdWDZco#$Z zij}J^oF99r=hV1VY(azH7&seMY?U!*<5VTv?h(4@L=pd&(I7e*uda#u@+s diff --git a/sphinx/locale/de/LC_MESSAGES/sphinx.js b/sphinx/locale/de/LC_MESSAGES/sphinx.js index 98aa5c125..542c094f9 100644 --- a/sphinx/locale/de/LC_MESSAGES/sphinx.js +++ b/sphinx/locale/de/LC_MESSAGES/sphinx.js @@ -1 +1 @@ -Documentation.addTranslations({"locale": "de", "plural_expr": "(n != 1)", "messages": {"module, in ": "Modul, in ", "Preparing search...": "Suche wird vorbereitet...", "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "Es wurden keine Dokumente gefunden. Haben Sie alle Suchworte richtig geschrieben und gen\u00fcgend Kategorien ausgew\u00e4hlt?", "Search finished, found %s page(s) matching the search query.": "Suche beendet, %s Seite(n) mit Ergebnissen wurden gefunden.", ", in ": "", "Permalink to this headline": "Permalink zu dieser \u00dcberschrift", "Searching": "Suchen...", "Permalink to this definition": "Permalink zu dieser Definition", "Hide Search Matches": "Suchergebnisse ausblenden", "Search Results": "Suchergebnisse"}}); \ No newline at end of file +Documentation.addTranslations({"locale": "de", "plural_expr": "(n != 1)", "messages": {"module, in ": "Modul, in ", "Preparing search...": "Suche wird vorbereitet...", "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "Es wurden keine Dokumente gefunden. Haben Sie alle Suchworte richtig geschrieben und gen\u00fcgend Kategorien ausgew\u00e4hlt?", "Search finished, found %s page(s) matching the search query.": "Suche beendet, %s Seite(n) mit Ergebnissen wurden gefunden.", ", in ": ", in ", "Permalink to this headline": "Permalink zu dieser \u00dcberschrift", "Searching": "Suchen...", "Permalink to this definition": "Permalink zu dieser Definition", "Hide Search Matches": "Suchergebnisse ausblenden", "Search Results": "Suchergebnisse"}}); \ No newline at end of file diff --git a/sphinx/locale/de/LC_MESSAGES/sphinx.mo b/sphinx/locale/de/LC_MESSAGES/sphinx.mo index 981da26a594649c14f5fa33513264e8208892368..1f8f8d2d7b8098498a9dc0f12e4f75942a5b632f 100644 GIT binary patch delta 3093 zcmY+^d5m3S7{~E5?a=Bno$f1rm8n){ZnTOjRjREns2aPXXYPGx?&+L4XPjlO60V3K zwN-|Q=pP78YKvq_M36`|2oaIS7A-*#{-`BFB^BS_xi6);b3f;O@4Gzj^FF6)0~@nSp@pFoCqJ8>rN!qb%Y4|q^&M=DQEp4WoP#5i`-hI9GSNf+TTT*NyHHp25!SWmx31$?RC{{i+wn|%29@&fQGqs7NUEilR`RbC%%&yhp*C26I{8x6g!MQauS8|w z8r1kMRA9Zh6;qsxf4TlP7Exdwcr-3Yt-FaY?UU4bP}Sao+UQ}_29KleatCUIXHl=+ zE>uQ7MlG=4{r&@L-Y=-k{f-*fJfRWjXy+s(Ht%RuM(QOVG;l5Ib=iOlq!+hRj5+ct zj-h}iavTLR9d*}dI?qEs-ok>I`G zP?3(Hlr>=*s;ZCUYc`&a8h<4!pafNH51|5n!L@gz-v9lmd6U`fL_7tH_kR-)I(auL z)weqD!gFbFL*4aWRABpD`vB^sf8b(lrJ>hr4Hg;13u))548Mt5=Urrqw-=Y_{r}Mo zn9FgNk@61gpudl(wBe(ux8ylg5x#+Zyghs=;4hrtAxZNN;PKc@I&{+c$l<+9a6WEE z1@Iu&mD*=`P|99Hwcl~>MFsE$>Mnmqovew<(fHA*@yDS0=Q~fvV`wi$gBwwIf3x#$ zTtoYjnY{l5>wQg!?)nhw{cqua4;9TqRFyA7ophb+??i35300JvQ77tm?K@HL|Gjty zZg;U!vxZ zBn?XaI8>3gp{{Z@Dx(|gZa|2N>^9U!_n=Pp0O}+UqwaJEYT#Z=ow>{`>9Qrn6`B2)e$cbuSc0pOltk4 zTs1uQr6x{{Z~Ed&9@=(O4*j&~>dvEb7Q~T>{61UqRwhZDc&n1Q&s1$<&6YSfWk33N zrK(M>sl?^H&qi5VGAoOH81>I)qX@;+;(Ag^O%P?V$*R_L#W$EP8^$%`M-}!C%DrYz zBe*#wb77oWhWS}Bw$WWI^KWdmAPkM4XK|mO1!X@BxBL@Ow@$^6ad$Df7PD{3T;wn7 zv1zeJIgTZ(TtDi`x%_Y)ffq`q*L3qZW27SY#HQyyTQq z2iwLU9IxvN(q7$yjfz{FHR1SS^HvbxO4642Jtoa;HB)SDX}h_~2JEA!G_X}Wbn~Qp zo9gG;E*qK7z#1DwJYAs6?Pxda8q0Q=xWam?@~Brgoa%-n4UJ0PDq9V0;$6nYR|5w5 zd1`uhzZ7X1Em+}iMci9lGdX8iC8w0qyj-nuu;XDRW__>Z@Md{R~6uP^7C#pNAqn&Ei4Z*lH6tea+TTIpk0flML-%wO%$gg z;(DVVQYt)Rd{GC)O+wA(aiZysa7`^pDkalt1NvBwqeTJhYl3YIqV$^GA1 wqCC5i3ALDjSaRXCxar8Na+BrJ;8W9IKI)t>AfE$qG-zk!!&!WA-;5vr2JUnW+W-In delta 2107 zcmYMzTTIkP6vy$iWtHtJs~~dQvVgYr(xBN$lvrh(8f>Zvl9<|{)>6BODY9`5M2TdR z8WN!orTv#^gVD6!+6RMiwMA2HgAd9BUeX8cgS=>nQ6EguMs1^he{_-(;PapP|7Yf$ zGc(VtE-y)q=J@-JpAP=s;O}9ETL1t2mT5ML<^`OEm+*BQb3Vds+Rrf;rv}WXVHr-v zC}v?5PQe=Y{$reBma=9Z@_4Zar=y3O@F;4)FRp(G^J)Ky473MWgfFoGi-=17i?9$s zz{S{zC3pa1IEYH9$Wq9(Y73S`vz7&Sgf z-ODh7+KTs3Td~%)H@Wt9OewMs9#rx!RC_;a!5>k9oj_IQtb2bEbykK^nU5jA=Hp{x zun;PcA`IaIoQ=y--!-Bt)0##7Rnj&(G_VuZ?sgx1gE~|P-20QL3D4m&yn-s}Bsx`@ zGSnG*2Nm!#XEkd6T2!J9sP9`s)L#d_oepK(ff|@X1+ou&uovIPF!fab`>4QHVKHt- zP27oE=xfxW>_;th1~vah)Ye@>%`=?hLD%XAsw9t56a3>o$Rr&NoQ5i0F6z57RG@R6 zQRLT_@=q06jrwjY>Nd2Z0@;T>KC^F8fuxFa{tI9>YVTJ%>rokQL|wZbNKDp^3gmmF z`gR;O?u>i?JL)=LLsei5RhgH_nwHJM(D$>D!<({l9!ls~ff}#{RgpcY!*v)LYv)~i z1a+_Pp~jUEWej6Dkr686E>wvRJ5S&W+5@P{jbpa%|G%yyL^#ScA1iSo>KZkpO4oz6 z_#LXWcTf}EM`b+j`hzseX=kG{k0G&IJ?gB*Q2}nlOxCx(dcd!cSj@vW@h6;*BgowL z6z5@xD0#F>R4MCF6>4zp?ap1O0QRD`t`C*SG1T`1IC1}n+=~&6@Zu(x;@_w}&Szib zTd2qvq4shO>Rx|>Iul>w#OX&R)bIL_pcX!b+M@HQ1pX+X{_40%2RF=aCQxBC3+5}zl$^~HmM Y#+Gf3J4+KyUO}WSBc6n+a diff --git a/sphinx/locale/es/LC_MESSAGES/sphinx.mo b/sphinx/locale/es/LC_MESSAGES/sphinx.mo index dcc8bbc2dcf5008a77f1fb6cc4f83bfec29d0fef..2989194c97f216d2d318111a949b3f1431e0642d 100644 GIT binary patch delta 2036 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 TuZMSu|Gre|Yw?PgRrvlJlHd^S literal 0 HcmV?d00001 diff --git a/sphinx/locale/fi/LC_MESSAGES/sphinx.po b/sphinx/locale/fi/LC_MESSAGES/sphinx.po new file mode 100644 index 000000000..7bbe636e9 --- /dev/null +++ b/sphinx/locale/fi/LC_MESSAGES/sphinx.po @@ -0,0 +1,600 @@ +# Finnish translations for Sphinx. +# Copyright (C) 2009 ORGANIZATION +# This file is distributed under the same license as the Sphinx project. +# FIRST AUTHOR , 2009. +# +msgid "" +msgstr "" +"Project-Id-Version: Sphinx 0.6\n" +"Report-Msgid-Bugs-To: sphinx@awot.fi\n" +"POT-Creation-Date: 2009-01-24 18:39+0000\n" +"PO-Revision-Date: 2009-02-11 11:21+0200\n" +"Last-Translator: Jukka Inkeri \n" +"Language-Team: fi \n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 0.9.4\n" + +#: sphinx/environment.py:104 sphinx/writers/latex.py:170 +#, python-format +msgid "%B %d, %Y" +msgstr "%d.%m.%Y" + +#: sphinx/environment.py:300 sphinx/templates/genindex-single.html:2 +#: sphinx/templates/genindex-split.html:2 +#: sphinx/templates/genindex-split.html:5 sphinx/templates/genindex.html:2 +#: sphinx/templates/genindex.html:5 sphinx/templates/genindex.html:48 +#: sphinx/templates/layout.html:126 sphinx/writers/latex.py:176 +msgid "Index" +msgstr "Sisällysluettelo" + +#: sphinx/environment.py:301 sphinx/writers/latex.py:175 +msgid "Module Index" +msgstr "Moduuli sisällysluettelo" + +#: sphinx/environment.py:302 sphinx/templates/defindex.html:16 +msgid "Search Page" +msgstr "Etsi sivu" + +#: sphinx/roles.py:53 sphinx/directives/desc.py:580 +#, python-format +msgid "environment variable; %s" +msgstr "" + +#: sphinx/roles.py:60 +#, python-format +msgid "Python Enhancement Proposals!PEP %s" +msgstr "" + +#: sphinx/builders/changes.py:64 +msgid "Builtins" +msgstr "" + +#: sphinx/builders/changes.py:66 +msgid "Module level" +msgstr "Moduulitaso" + + +#: sphinx/builders/html.py:118 +#, python-format +msgid "%b %d, %Y" +msgstr "%d.%m.%Y" + +#: sphinx/builders/html.py:137 sphinx/templates/defindex.html:21 +msgid "General Index" +msgstr "Yleinen sisällysluettelo" + +#: sphinx/builders/html.py:137 +msgid "index" +msgstr "hakemisto" + +#: sphinx/builders/html.py:139 sphinx/builders/htmlhelp.py:182 +#: sphinx/builders/qthelp.py:131 sphinx/templates/defindex.html:19 +#: sphinx/templates/modindex.html:2 sphinx/templates/modindex.html:13 +msgid "Global Module Index" +msgstr "Yleinen moduulien sisällysluettelo" + +#: sphinx/builders/html.py:139 +msgid "modules" +msgstr "moduulit" +#msgstr "osat" + +#: sphinx/builders/html.py:179 +msgid "next" +msgstr ">" + +#: sphinx/builders/html.py:186 +msgid "previous" +msgstr "<" + +#: sphinx/builders/latex.py:155 sphinx/builders/pdf.py:162 +msgid " (in " +msgstr "" + +#: sphinx/directives/desc.py:25 +#, python-format +msgid "%s() (built-in function)" +msgstr "" + +#: sphinx/directives/desc.py:26 sphinx/directives/desc.py:42 +#: sphinx/directives/desc.py:54 +#, python-format +msgid "%s() (in module %s)" +msgstr "" + +#: sphinx/directives/desc.py:29 +#, python-format +msgid "%s (built-in variable)" +msgstr "" + +#: sphinx/directives/desc.py:30 sphinx/directives/desc.py:78 +#, python-format +msgid "%s (in module %s)" +msgstr "" + +#: sphinx/directives/desc.py:33 +#, python-format +msgid "%s (built-in class)" +msgstr "" + +#: sphinx/directives/desc.py:34 +#, python-format +msgid "%s (class in %s)" +msgstr "" + +#: sphinx/directives/desc.py:46 +#, python-format +msgid "%s() (%s.%s method)" +msgstr "" + +#: sphinx/directives/desc.py:48 +#, python-format +msgid "%s() (%s method)" +msgstr "" + +#: sphinx/directives/desc.py:58 +#, python-format +msgid "%s() (%s.%s static method)" +msgstr "" + +#: sphinx/directives/desc.py:60 +#, python-format +msgid "%s() (%s static method)" +msgstr "" + +#: sphinx/directives/desc.py:82 +#, python-format +msgid "%s (%s.%s attribute)" +msgstr "" + +#: sphinx/directives/desc.py:84 +#, python-format +msgid "%s (%s attribute)" +msgstr "" + +#: sphinx/directives/desc.py:86 +#, python-format +msgid "%s (C function)" +msgstr "" + +#: sphinx/directives/desc.py:88 +#, python-format +msgid "%s (C member)" +msgstr "" + +#: sphinx/directives/desc.py:90 +#, python-format +msgid "%s (C macro)" +msgstr "" + +#: sphinx/directives/desc.py:92 +#, python-format +msgid "%s (C type)" +msgstr "" + +#: sphinx/directives/desc.py:94 +#, python-format +msgid "%s (C variable)" +msgstr "" + +#: sphinx/directives/desc.py:112 +msgid "Raises" +msgstr "" + +#: sphinx/directives/desc.py:116 +msgid "Variable" +msgstr "" + +#: sphinx/directives/desc.py:119 +msgid "Returns" +msgstr "" + +#: sphinx/directives/desc.py:128 +msgid "Return type" +msgstr "" + +#: sphinx/directives/desc.py:213 +msgid "Parameter" +msgstr "" + +#: sphinx/directives/desc.py:217 +msgid "Parameters" +msgstr "" + +#: sphinx/directives/desc.py:465 +#, python-format +msgid "%scommand line option; %s" +msgstr "" + +#: sphinx/directives/other.py:101 +msgid "Platforms: " +msgstr "Ympäristö" + +#: sphinx/directives/other.py:106 +#, python-format +msgid "%s (module)" +msgstr "%s (moduuli)" + +#: sphinx/directives/other.py:146 +msgid "Section author: " +msgstr "Luvun kirjoittaja: " + +#: sphinx/directives/other.py:148 +msgid "Module author: " +msgstr "Moduulin kirjoittaja: " + +#: sphinx/directives/other.py:150 +msgid "Author: " +msgstr "Tekijä: " + +#: sphinx/directives/other.py:249 +msgid "See also" +msgstr "Katso myös" + +#: sphinx/ext/autodoc.py:442 +#, python-format +msgid " Bases: %s" +msgstr "" + +#: sphinx/ext/autodoc.py:566 sphinx/ext/autodoc.py:583 +#, python-format +msgid "alias of :class:`%s`" +msgstr "" + +#: sphinx/ext/todo.py:31 +msgid "Todo" +msgstr "Tehtävä vielä" + +#: sphinx/ext/todo.py:75 +#, python-format +msgid "(The original entry is located in %s, line %d and can be found " +msgstr "" + +#: sphinx/ext/todo.py:81 +msgid "here" +msgstr "tässä" + +#: sphinx/locale/__init__.py:15 +msgid "Attention" +msgstr "Huom" + +#: sphinx/locale/__init__.py:16 +msgid "Caution" +msgstr "Varoitus" + +#: sphinx/locale/__init__.py:17 +msgid "Danger" +msgstr "Vaara" + +#: sphinx/locale/__init__.py:18 +msgid "Error" +msgstr "Virhe" + +#: sphinx/locale/__init__.py:19 +msgid "Hint" +msgstr "Vihje" + +#: sphinx/locale/__init__.py:20 +msgid "Important" +msgstr "Tärkeä" + +#: sphinx/locale/__init__.py:21 +msgid "Note" +msgstr "Muista" + +#: sphinx/locale/__init__.py:22 +msgid "See Also" +msgstr "Katso myös" + +#: sphinx/locale/__init__.py:23 +msgid "Tip" +msgstr "Vihje" + +#: sphinx/locale/__init__.py:24 +msgid "Warning" +msgstr "Varoitus" + +#: sphinx/locale/__init__.py:28 +#, python-format +msgid "New in version %s" +msgstr "Uusi versiossa %s" + +#: sphinx/locale/__init__.py:29 +#, python-format +msgid "Changed in version %s" +msgstr "Muutettu versiossa %s" + +#: sphinx/locale/__init__.py:30 +#, python-format +msgid "Deprecated since version %s" +msgstr "Poistettu versiosta %s alkaen" + +#: sphinx/locale/__init__.py:34 +msgid "module" +msgstr "moduuli" +#msgstr "osa" + +#: sphinx/locale/__init__.py:35 +msgid "keyword" +msgstr "" +#msgstr "avainsana" + +#: sphinx/locale/__init__.py:36 +msgid "operator" +msgstr "" +#msgstr "operaattori" + + +#: sphinx/locale/__init__.py:37 +msgid "object" +msgstr "" +#msgstr "objekti" + +#: sphinx/locale/__init__.py:38 +msgid "exception" +msgstr "" +#msgstr "poikkeus" + +#: sphinx/locale/__init__.py:39 +msgid "statement" +msgstr "" + +#: sphinx/locale/__init__.py:40 +msgid "built-in function" +msgstr "" + +#: sphinx/static/doctools.js:139 sphinx/writers/html.py:425 +msgid "Permalink to this headline" +msgstr "" + +#: sphinx/static/doctools.js:145 sphinx/writers/html.py:80 +msgid "Permalink to this definition" +msgstr "" + +#: sphinx/static/doctools.js:174 +msgid "Hide Search Matches" +msgstr "Piilota löydetyt" + +#: sphinx/static/searchtools.js:274 +msgid "Searching" +msgstr "Etsitään" + +#: sphinx/static/searchtools.js:279 +msgid "Preparing search..." +msgstr "Valmistellaan etsintää..." + +#: sphinx/static/searchtools.js:338 +msgid "module, in " +msgstr "" + +#: sphinx/static/searchtools.js:347 +msgid ", in " +msgstr "" + +#: sphinx/static/searchtools.js:453 sphinx/templates/search.html:25 +msgid "Search Results" +msgstr "Etsinnän tulos" + +#: sphinx/static/searchtools.js:455 +msgid "" +"Your search did not match any documents. Please make sure that all words " +"are spelled correctly and that you've selected enough categories." +msgstr "Ei löytynyt yhtään. Tarkista hakuehdot, sanahaku, ei sen osia" + +#: sphinx/static/searchtools.js:457 +#, python-format +msgid "Search finished, found %s page(s) matching the search query." +msgstr "Etsintä tehty, löydetty %s sivu(a)." + +#: sphinx/templates/defindex.html:2 +msgid "Overview" +msgstr "Yhteenveto" + +#: sphinx/templates/defindex.html:11 +msgid "Indices and tables:" +msgstr "" + +#: sphinx/templates/defindex.html:14 +msgid "Complete Table of Contents" +msgstr "" + +#: sphinx/templates/defindex.html:15 +msgid "lists all sections and subsections" +msgstr "" + +#: sphinx/templates/defindex.html:17 +msgid "search this documentation" +msgstr "" + +#: sphinx/templates/defindex.html:20 +msgid "quick access to all modules" +msgstr "" + +#: sphinx/templates/defindex.html:22 +msgid "all functions, classes, terms" +msgstr "" + +#: sphinx/templates/genindex-single.html:5 +#, python-format +msgid "Index – %(key)s" +msgstr "" + +#: sphinx/templates/genindex-single.html:44 +#: sphinx/templates/genindex-split.html:14 +#: sphinx/templates/genindex-split.html:27 sphinx/templates/genindex.html:54 +msgid "Full index on one page" +msgstr "Hakemisto yhtenä luettelona" + +#: sphinx/templates/genindex-split.html:7 +msgid "Index pages by letter" +msgstr "Hakemisto aakkostus sivuttain" + +#: sphinx/templates/genindex-split.html:15 +msgid "can be huge" +msgstr "voi olla iso" + +#: sphinx/templates/layout.html:9 +msgid "Navigation" +msgstr "Navikointi" + +#: sphinx/templates/layout.html:40 +msgid "Table Of Contents" +msgstr "Sisällysluettelo" + +#: sphinx/templates/layout.html:46 +msgid "Previous topic" +msgstr "<<" + +#: sphinx/templates/layout.html:48 +msgid "previous chapter" +msgstr "<<" + +#: sphinx/templates/layout.html:51 +msgid "Next topic" +msgstr ">>" + +#: sphinx/templates/layout.html:53 +msgid "next chapter" +msgstr ">>" + +#: sphinx/templates/layout.html:58 +msgid "This Page" +msgstr "Tämä sivu" + +#: sphinx/templates/layout.html:61 +msgid "Show Source" +msgstr "Näytä lähdekoodina" + +#: sphinx/templates/layout.html:71 +msgid "Quick search" +msgstr "Pikahaku" + +#: sphinx/templates/layout.html:74 +msgid "Go" +msgstr "Siirry" + +#: sphinx/templates/layout.html:78 +msgid "Enter search terms or a module, class or function name." +msgstr "Anna etsittävä termi tai moduuli, luokka tai funktio" + +#: sphinx/templates/layout.html:115 +#, python-format +msgid "Search within %(docstitle)s" +msgstr "" + +#: sphinx/templates/layout.html:124 +msgid "About these documents" +msgstr "Tietoja tästä documentistä" + +#: sphinx/templates/layout.html:127 sphinx/templates/search.html:2 +#: sphinx/templates/search.html:5 +msgid "Search" +msgstr "Etsi" + +#: sphinx/templates/layout.html:129 +msgid "Copyright" +msgstr "" +#msgstr "(c)" + +#: sphinx/templates/layout.html:174 +#, python-format +msgid "© Copyright %(copyright)s." +msgstr "" +#msgstr "© Copyright %(copyright)s." +#msgstr "© kaikki pidätetään %(copyright)." + +#: sphinx/templates/layout.html:176 +#, python-format +msgid "© Copyright %(copyright)s." +msgstr "" +##msgstr "© Copyright %(copyright)s." +#msgstr "© %(copyright)." + +#: sphinx/templates/layout.html:179 +#, python-format +msgid "Last updated on %(last_updated)s." +msgstr "" +#msgstr "Viimeksi muutettu %(last_updated)." + +#: sphinx/templates/layout.html:182 +#, python-format +msgid "" +"Created using Sphinx " +"%(sphinx_version)s." +msgstr """ +#msgstr "Tehty Sphinx %(sphinx_version)" + +#: sphinx/templates/modindex.html:36 +msgid "Deprecated" +msgstr "Poistettu" + +#: sphinx/templates/opensearch.xml:4 +#, python-format +msgid "Search %(docstitle)s" +msgstr "" + +#: sphinx/templates/search.html:9 +msgid "" +"Please activate JavaScript to enable the search\n" +" functionality." +msgstr "Javascript pitää olla sallittu, jotta etsintä toimii." + +#: sphinx/templates/search.html:14 +msgid "" +"From here you can search these documents. Enter your search\n" +" words into the box below and click \"search\". Note that the search\n" +" function will automatically search for all of the words. Pages\n" +" containing fewer words won't appear in the result list." +msgstr "Anna hakusanat kokonaan, osasanoilla ei haeta." + +#: sphinx/templates/search.html:21 +msgid "search" +msgstr "etsi" + +#: sphinx/templates/search.html:27 +msgid "Your search did not match any results." +msgstr "Ei löytynyt ko. ehdoilla yhtään." + +#: sphinx/templates/changes/frameset.html:5 +#: sphinx/templates/changes/versionchanges.html:12 +#, python-format +msgid "Changes in Version %(version)s — %(docstitle)s" +msgstr "Muutos versiosta %(version) — %(docstitle)" + +#: sphinx/templates/changes/rstsource.html:5 +#, python-format +msgid "%(filename)s — %(docstitle)s" +msgstr "" + +#: sphinx/templates/changes/versionchanges.html:17 +#, python-format +msgid "Automatically generated list of changes in version %(version)s" +msgstr "Automaattisesti luotu muutoshistoria alkaen versiosta %(version)" + +#: sphinx/templates/changes/versionchanges.html:18 +msgid "Library changes" +msgstr "" + +#: sphinx/templates/changes/versionchanges.html:23 +msgid "C API changes" +msgstr "" + +#: sphinx/templates/changes/versionchanges.html:25 +msgid "Other changes" +msgstr "" + +#: sphinx/writers/latex.py:173 +msgid "Release" +msgstr "" + +#: sphinx/writers/text.py:166 +#, python-format +msgid "Ympäristö: %s" +msgstr "" + +#: sphinx/writers/text.py:427 +msgid "[image]" +msgstr "" + diff --git a/sphinx/locale/fr/LC_MESSAGES/sphinx.mo b/sphinx/locale/fr/LC_MESSAGES/sphinx.mo index 3263329644ea4285efe08653d6bee8353ab58ce5..c7b2474d822be6a770ea5159e58c361efdea57d5 100644 GIT binary patch delta 2232 zcmbu3WKo0)#lXQUf3II zZPeI&U}d#zn6}2PUKBPrD_yOO>|rgUO|ur}bgh}C&A#9GZ}mO~_wzsJf6qC;-|w75 zZ_Q9`dbl9FC-Ad{ziausc$uw#e}=||FoEWGn1drY9na$BSU7&vQk+D)0w-e)UV+Qd z@eg4>wqhP`8hxJ*Px4SmM-N_&eRw4vL?;|X2b_re&)_w*UEOg-I0dV)2$#hDtFf4N z3g_c9I2Av@g?JKkLOO)9+z_s!;|8QJ)FEqx2D}4T#O>$M40@5|!(Mb;KhDD=Xdr)~ z^Ar*Fa-5E1u>*M(Hem^F!yMKRyLmA4J?H`l(9Ax@G5CGlK91S6&!G!kK({1^`Wi@H z>@;-zEjSGu(5-kB`3+m+b{D4Y*vW^Hy^5B+KW@K|E_f6T>&@*!m&AgB= z@ffO+*ut$?k4w;ix^N;sk27$8KJ|CNARU%y7%lBdbb`}y`;Yj27Nb2}MW86P>?0&4YV57oDgEyn*z39ZRqnRH@ z1NjUW;xFhPR}r-nEya6q1-j5naep5ga3=2m93$G_pcVTQOISbTl8*Ph9Lum0ooG3_ zKqGoaRwHYNwdl3mf)pj}zzFxFmG~50;B5TfY@Ba0dd*AF@#UCyuNLv(p}H5TR%k>s zZ$-Bxg$DKnI&crVz#-&9gk$JEKaQ5Zj1y)h??mtUO7zTZMiY4&J?zgGbN`)SCmk-> zhi2T5%oPUEiM~Yl?kBtp$Ix&K?nW!J4oNm_MKkP)-Hnca4XxCHxPK6>$j}t(ZzLz^ zFo08N`#0>xi#Q8+Z~*K-j8^C*@kVS; z^I#;~(d+X9y3oGZH_-(K&w_|Cn#Ky#ZO&u+drJ~gODA}HPq%9exnv+py zGSSi0oXb4X+70b|eSLePttGXo`sL#M?A$rCX3vXe&#k?AerCp`C~Lxhm&?=_%pCjw L*U79YT9ExW$m;ff delta 2036 zcmYM!ZD^KN7{Kvs?yZ*F+T2X%+Dl7knbkvM+qN0m zE0qPCgP$J$)$;FpzP$3F^n~M3nyR=QThB4oQO|gD=x!& z+=3l=7)|I8tY-ZfrNM7hl|(RC)Zt8QPW@NW3|1jYMlV+5T5Q3sXdvIB^9Yw#e&p-DfM5&tdaH5u;gpeem}b44m7Y`Xk`wj_s7t)GJs}&4f%~cJ|>1JLj$S7 zGJFu5@G4W#tL$xKn{|ue*2)5%_Xh{osXk{AFGc*ki zxIH-so&PB`(Z%TZE6b?A2mTEnm~js}FpCDV4&TK-oPv|6r_X1hfpy~DxD=hZ7hPy0 zdMLM|3mrh`KZb7INpzlpEDf*KS+pc0=mdYI4~j|0f#qoFs?hHm(LkprGsthW@t+mx zLcd#%-iB^8kahTZUc?7zAlccK{{`?QI^oLX8swXJ8{Nx|NKEkw8b}VQejG;wK9k;G zM!)|VJ)EPdU&TYO`Be1#4&+rfx@Z{j%jkd}tiwL^zVAazc^W;{SJ8VthWgjz4D7-e z(2RGYhjK5P@#*AQoK63GbgSxFY=ZYcL&MBF(Lfer2d+Z*b{{&?H#i?Jq6cvpv-BNOgc!uEng2q=J-LBKmQTGMcptjJT;u}8b7;w5 z!GHf=p!d2TJu6?J34D#7?sMq4%jh~oXrjL%zj4$0J5e=9)IDp)xi||g{d%+#yO7x8 zD4N-YHTuF^sl4iKE&Km@zTQFhSJgelFanXqYassww6q8Q$<5w?s#QWQEtk_)`EWk DOcl2W diff --git a/sphinx/locale/it/LC_MESSAGES/sphinx.mo b/sphinx/locale/it/LC_MESSAGES/sphinx.mo index 3aa570de0b894937fbfa49138282747a71e346f9..4f95d152b4c88b610df53ce0ee81c18f12811265 100644 GIT binary patch delta 2278 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 fdSy+zaaChFo0yq5?N}<=kZms8l%M@E^>^X{Ta% z_tgB`rSYrd6F+qPZR0=8|BVE-{{K6fvjB{f# z8#TWGQ*i-~#%06z<8BQXlj-m=9p6R;YDW$1wEhz~h4!~N0e{9!yoni@KsM?R<6JDn z9DEbYuobm|ew>7tG1v^dc(pmF8=x_%)~vM^WQsQzkHVz1+~ z*o+Fi54F%S)S>J~E%XB_{s8I`{(_40N1O}2PS;T-36Z{Tq@pHFLX|8Nb$>c4!2)w0 z@^Op#QYETT;~H=(2B-w~VtfRT4iztB{BR=iJT8>LOw^86nzg7MZMF6uWUlK(J=?EP z3-qB*^HsZlAN87s7^HaFsCKcnUq;QV!5ngO+qux8I*dx>j13qx@1fr3G@>!VRbUzV zs8W80FW?E(&IeEx`VH6PU#K0I@yh6ttUy)7$FSc2CNA{ex1k1JvH`#27TVWPf!DH4 zxdD}M9V*bfW;<$r2Wp{DQRBZuLbyKE_(AKxAz9!3%>^HKhcBwTHtfk`+Nbl zaEJ#d!>IRpHY)I|sKE88z?+cs?A}2o&~EoTP;rmi{obk6UlT6Uu?By&0r`y5#FvoA z=c-T()R_&a(;irRKWf1aRJ`M;x94lS-)o-7$MpB3&QO0A_19rZV%u6M9j9X+YG<#Y zDpZ3y{qLa?`3SYZ5o>p$68OUGH7}Z1Q1fn~68skx|Itz|w9|BcMKmB2H6RzY!vgDH zZtW`64^{&@&-2P7F+W!7<;8m1l8QzxiTbp?NNrHx5(#{7d88$>x^{E@roaoDJijsW zM%4F$jlLK2Bb#eCrVzlZ+tSGJrp8FLKG;^!b8gJ-gp}E{ispDl#ib>451vlHJNk)b X4z?xD?D=V25Gr5w^lMdQL=*o5RW|Fi delta 1991 zcmYM!Z)lZO9Ki9jHh0}}cYn-3bJLqvP7}kcBlObL7vbnl6S9PvF^LhhkXnh+i*D~S zal{x-2qdFYD-GqwD$E#(^arddp)b-&E1E)N{&_P>?EBq*(0II`=bZCAzwHdO3Q{O#mlGyi@rxAp(uo=i&9X!hYE9Kb3Z3Wu?t_78XuUc_3wjx(@qdP+5z z#k;W?9bba8Q!1v_+|<$0fd=YAAMB0(*KrQ*w{a#O!g+WC=i>S3zlIOfE+@Mj7H}PQ zq6>HjXW;?lN<;iiXZ|$I&00FXpX{KsdMe|3WDzNczSx4T*oG$1iw5e$4%~;8IF4ND zFMgVE0!?5Rt765e39ZOVoXPxYJvVpZCOdF5R$vc0!HZ~s*U&`X2nW&UkKjTaMoT+} zmi|Vx??k(nP7`ZJE8T)cJJxXHgpZ<`J%&^>ZAQnt(7n-vu6!4ArT6(Eb~=V8@)c%r z1n$?7A+$25(7kg8O?WgM zM<@6jUFpB*^I3wqzvrS0Zq8DFUtCCsi9CqAaV0LslhOY>n%JK>AIqq-fph3Yd2}8-`#2u>98K`+@LP1nBWNXlMFZW&Myz1a z1QuYijAMo-aF}eJ_)~NtXT#zj+;F9TqNAo^YJx@RH(iAWZbx_TwitgEJ(h2w0pE-E zP_%zU-}?=7cpKeA^9gDq1!TOKwocuoo#^@PM_>33*Wnd(1xuLaetZaB@e^oeI`J8N z7OmVj=%@Gzt;7{{;v48OujL5&+~Zi~`QO6L4m!Hgz`ulJ=!;j;K$R?C>(Bu6(1}{m z_tqnirgrqXtHusb^X(f^^2V(H6Fep+dH&9(CC{PO(jd-JV@ Z*8ITY`kMnMGD}Mx4X;#|DjRz${sRN&usr|( diff --git a/sphinx/locale/nl/LC_MESSAGES/sphinx.mo b/sphinx/locale/nl/LC_MESSAGES/sphinx.mo index 2b6ac75ee340ef6088968610374d1ce2a2f9c08d..035fd0e321ea5e48d141611049b89fab6158db0a 100644 GIT binary patch delta 2181 zcmbu-YQpe-Gc^_y7C(P;}7~ewQ5G zY53dCzlr?&6s6kVziV;EjHDXD80^C-cn{<8qjeCIsQ<(ij2~glXv{>7FF+U0#YC(c zdLK3`D2$`Qk7KX}HBmdN<2l=Y71OBS#p1H4l{@g@Q1AzB@9Kp0NIpTgc|6@Lfnc9;2bi<^x+bGfU%fD^c2kmoPar~ z0LoAsu0$8>oAneF`8FJm2W`C-qp5eH7C4KV;4&(Zi1j{d{41P{gQ(PxChtmp77x|) zZG9dpuqq5I)n40Bhgxt4>RUCVGSh0`x1-KT7i#Cd$j=P$U`_KD%kT>-pnN77g{3$Z zm!SFwQ5ibmBL7P5VHz~Saa8?`?QjWon7ZxzyQm5KaUQ-#r8bR5WoQ=a49!OczSz1F zHU9?GhU-!N_m3j~I`Btm(9YXX15cm=IgLm0BIe+9@~Cz%DzG&;33s3-K8{-G0_spk zPzyao%|C$pgwIj)ya`j#b^3@(Ni5;(g$p$x6_v6K)cagifCW|$@-wA8l!>LNe%o+7 zhEM?zvAE*I7tM^>?GLUopn8zFA0tF{T1_t=6I@*oC>+j@o%ID)rA% z6MnGuU#Ngb@ZTd@Hp!?IXQOuNLCsf!>gPoTunxnzmjMb|pdGb9#M+0t&yP@tD}hxx zrzQtAt{C-AS6k~)3pUyM9$PRH`?jb{s(U3!<*`0nEe14DzoR9`dfp%27L8g=E$2Lmk4C zwtfY*&|TC5{is7YfLiDUX5)L*24YE@0(YSfWh&~^WTM{BsI)IUwxJZ2;tJHET4~#N zB0tl@Lko4O;y6y3FX#`>ak7IwZE^0Hh4p^wj;}TpX!eEtPPMPux4gC~us!628XbRw zZ)3gR32pH^LBFr5c1r>iICVQ4=-$}is}F>B7xdg3`8_IO=5%+V=cH5mwTQ~<^ojQlhf)S|X6!L|H7^DTwKSZU0!mf}o z(IjEMS0JTLMIySs;432|X|nK-E&C&U8G<3=%IFW#vhP<9G_KF*Ip;agIltfUIma*O z49&{kD9hgy`0LGxk=K|icZvq4qPAmJ8=T-PjM{v;7fQOEAW@tKa8_!Cx|YMO*kLl zK@&KL~&1-c0^sIxaqnU3*e&H)F%pJZ(1G#`D zcnzoEP2?96OloD4XhkQW@1={Wza4dPz)W-#HN^p~=!C0q9)5_Hv+39bJoNxDgGo3k_s9 zdVUX~B|eO1dJG+xLyvDS*5M+)pZy(ZU|Z3|4j{z{7bjAG_DvXw9lxUsJw+E7&4=>a zCDDb-@fEB_Gk6mX{4I1dE<-=byYczD*xwP`ThI!3p?hgxWqfc7{R9`#g?`2E>ax1r mox%|Xx%%SaL{X+b(^#EpXllrG*OU(DCYK#4$Q4!WPy7egh_EpL diff --git a/sphinx/locale/pl/LC_MESSAGES/sphinx.mo b/sphinx/locale/pl/LC_MESSAGES/sphinx.mo index b08244bff3a3a0ea7f9f60ebf007dd310c1104a7..93fd9f945ddae954108c09e68019f9914c8ca845 100644 GIT binary patch delta 2181 zcmb`{-%poS9Ki8opahB-Nf0VLWzp6IC4rh4l3SaW(^XijS^15=3XUJ@_Z!RB{MP2M z8A`1mL#;XSqGi#AOfIOcAC}fyiwkYbvaRSMFKD&0+Pdlemb29#5PNuD&pFTe@j0L8 zobTzT{@ZfjmFB+^_}j(*LjHfuv-I!Z+XW%ap*VswaU8G553mp?qf>Yl#!J`aW<}>fI+l;I5s$jZl>e${rl*EpW{kAkEXVq zN;9+^-9xvdfv=A~fR4WzU2qrLe)nAR?}mSl3RgaWc6<>HN8U7UBD%80}DormPZue-j#DUG!Gu z3a#AC#64)cZoC$=XaEQB!x?-!bi9X3rvu4t<-q{D(Scux9zrg8vH-Em~Ba0)%oUtu*C zllN6vi>9(0ZI_AVel&vv*o-fu8JIv9a2^f#B9?jnf9GKt6-AsWBX34K+=~z5CUk-^ zbOoQG0iHus{WDhKC3J%M4C2ZcqwgEgPtlC_-x%vt%KV{&2d>b|&EwUNPIwG!a10qc zTtEl@4gECv{2X4M5Dj=S`o0!@--2dnJvwn4+HP}n8|M7M$nxO%d=)uSVI1x7DSDpI zqMxRmWjk;q+Wt-?d7%?c`R-^xxboqefnI=L&=m%6Wg zXXo~8lI=~>J*mgK(n+=>on+Ffo$Vb(43KPjqKD?aJ*lqF?5?`ecjx??S9D8leM3^e hd_`l^=-9l*8MFU0&r1UZOGhh8TmO%_?l1o(?;lk5>I(n> delta 1992 zcmYM!ZD`e19Ki82@7A2T-92Qxx|=sQnqdvPy2&0@CruD+?!6@+d zCJSp6hzenmR9fMS(S=E=VO#E%(KhOVX8B72Fy;z%44aE^`#~oOQW8nlgQJ%zW@LSB{FE}5o=B8AS z4R|%?(e@kh+LX$vmxo3w2GM~^XvfV_zZF|4zl1Hg9~a>v%;6VNe+gGo&JbMz`*Ahi zk1pU9T!615pESnTT;@*`JlsabN0%$8oOdPSCS(z*fWEjCyKw*wU^6<<2oBG9KvcGMkm;W4)7Ej$TQ(CwEqEIf)i+J zr_j{TM)}_;XQ?!>JeujHShk{%2PeE8jchHF%`}9zm(a5@jIR87f(XAbO(BW*JA-+#??5Au3!f3_gj?f*bh^h z#Z}mfuKXT!0UOYOA4YG@7Q6*V(7?yB&ins459_Hoi%!r-Z&z?Px~J>V6hDHC@kw-o z-RR2qMf*W?3&zp+Pe=Xv@F#TQS@bs5QD|oV)X9T~tq*BSC3N5?(5-n6FHeZBa9^~K zM*C4TL#NP*zeM|eA6`U%AAU!#@ov1p$}$2%3}ucQ4Oy5+yNMMIv;Ox98dy24dhdB3(;Q|YR| kl$lrTD)wGq?C$R_Ryvz{s&*Wz?W*i-UQ<)a<)$|=9G=O9|jsp7}igi(Sa0(1*8RKNc{4c%2(({w6xW2k6W`#XS5jmd{{5cv+mFQADfqcW}SRTNf6|ZnHvOQ?Zhhq6CI^YR3urJWeoQcnWLifxSbmpbJ z#BHcXVhc-gIkuny4d4`f6=&hwlgYmgPElcsM$y!sMLW0<%fH6w6KL(`nutEHKs%hr zWf|6?sqH~Cv=!Y;JJ7)QMh~Fv4^JWg&iFVLHaLwQfFIGBpGO;BL<75u186?yz!tQA z2o3BYR^SP=-wWtKf1#VRm}ng5Hnjih95=4vLbRhL=<#YoGx8|f!TR`oBihh*X09K7 zZz~$;%h6rPHwluaDmVKku+a$D4u?v{1NsmRxoJ??hHBEJFidfxf>6`G&{2xY?gXhRlU++|XCpjdt+<_=9j1jr=P#wU==^ z7E##Kk2U zL>mra9e#rD`aCM_s1onNd1#7z(SA0g6L=O~vNzDc_MjOW!E(kAUvlF)AB!*ij5a7` znjXs(8ptek=JUB2Kr@n*(293p7CnZqp&30G{TyxoJ-Q_4V*M}ZJ_?0wO$SV&9af-A zQG+&Uz}dJ0P4x!kAcSq`Om?B?d>;~fxQzBYiJj&-FGtG_XdtVi50sIAH_yYdq7zN& zMsy}mp#kkgJKm42ID!T;mzVz8Way07pn=6n zFrLIJ>}Mfe(;;L(g+rL&NpxnH(23-+F2oi}(Eb*n1J$B4Uy5d|89iP1<>G@Z8u=!4 zpy#67(3$N(H`hC{{y_9_d_ICM(KqP8{tNj>RK&%B=UPaTWO=$f(_Np;?heV^wvHqW ze^mHjK~sB%>Lk53+t!=TW|9@@-t_9VU2Pk(Nwzb|bfh0?&m`G(nWQ_D?pnL9h<=jC zdOCQ$vm@Q!mhGz^E}LAGUvyVh&7!1cVg2IT;i{?ACKUf?xZ$Rf%m2qXHL1q@zX2pO B@U8#= delta 2036 zcmYM!ZD`e19Ki82z3b|9bFOW!t4*h=p-j0pV+^OV5N#VNy-9^I338y>3w7dj-4`;@ z1wP^fTzqImF|Z8pGy}8dL|R~2f)s^s3?Y@6PiYF%?>7%PHb3W_|9SYG-#N#x>jr8w zS4$H60zYm1jpOguP;1YB&Ll&~r}`aE#6BF3*P{bCn))Lw#gW587==|h64O|Sb8!SV z$L~w=#Sk)~g+e(WwqP;tMJN0W9dIhPpTjZKFCzoPO-$hvtiTje+5Q^7gbVR?T#4iH zAkM?n=!PC*8S95Z3jBuBf)JQ1RN`Em8tWgRJNO9MWN61S?7$k#qJdmO=edcC@jkwQ z3)lt4(2Qg89W;P-SkC%k69pI8h3?=m4#5+#ei9SZ`_Tn{Mkn|U4diO{9y-2&yjNi* zdKB}~qgWE_@5cIvm@%?83Z}dRtsg)a>_P+k0?o|H`28$;SNhSNUq^mJ9-WCH6rq8n zun1@1B&SrXL{pkiqnW8f@6dEK z;5pF+==^V?8(og}UsFW>z3{CxxZ^f-Unk{YQn|n zj&pQ1ZHji&k>zJWiX8!h7L{Qv&PP_RQaI&e1DVl#TnJJ5-`uo;h`sr?U~$U$yk zIC@l*(ZHsm8EQmd$x`%LuZ!PXG2#2)Pr+xGMFaU9-T7B&02h$WhHE$tAD|OXq?0MF zk1j#SzmFct>e#*!J(^B5z$`l7QOtN2Jro?!i<9vpn(DjA#Sdj%Wq0xlvUZq-PWUGJ zu9wI9$7ldMqX*DCb0pS}qnZ2$-9T>z=Wir`(%{4c_#P&?vIfwC2G)u0bUzw!cl1=W z51r>ytpA1X^ftQSzfo89juc=Hi&Nykn!Lyp2x0 z23@EX-T7uTQ(Mtzy*sw|pn;!3*XfV`+C;&f{efPpf8vMx(ZTpV$wlyJQs~0-(f@cF s(S=(u_jhtde(saPVTpotb-H#!x~8rsojWwTJTLb{$v}SYZbg0KDFOMnb^rhX diff --git a/sphinx/locale/sl/LC_MESSAGES/sphinx.mo b/sphinx/locale/sl/LC_MESSAGES/sphinx.mo index e0936704e780becff6be4b06fe0f752a3587049e..e8cc5a6e8124a941293c51410ac1c1736792ef29 100644 GIT binary patch delta 2233 zcmb`{?`v089Ki82w>g{6a%*kNrgv+WrA6LYPAFEau}Stj1Bi4NE4CTZz*s-;Z}HH_ zqy5)m5jNvw>>O{;hHX5QP_YN^!cXuH{0<#(5bf|=tiOt7l%3sv<#;#F#d2I3>tDnQ z${DP~w{a$Zk5Axv%n#WRW)+4|O2r(cE;Jx>ghqTE*TnK}bOl|=;zKvuuLl?62{e$u z&~eI%`WdXoiP(lTg-)D~TQQ&c!$BTg`A6skN70p?#0mIIET6+X%Gb~d{y;xTKKV6} z$hFoDwEN{oG75lgu*~e(gdt$i{op1mR>}NDH=VJS1bkAHvS6;$P zJce2%w(tlp!~ID>02k1eUqU-xMFYEm+tGa92RqRE z9yGA8u@VQ+aj&2gjiH-!GSN6s4LW{pmIuG#0(78y^msL(8F?8UpgFd`fp)Z?ncIrK zw+jvQ{pca&3fN>k=uh*j+4#avbmDi>j$P3Y(3E$_ z@=1Xh~C@ zq}FGeI#QW*vMSY)dTxDN)9aZevoT4xre11ECz%cDq&=N#Tfd=@agtXywetGL)>KPV trn9!UqUcs`;lmHjUzp5auyj#fZ{@TJIaB^SU+;|Kul|pTPL=J={To(r^lktE delta 2036 zcmYM!ZD^KN7{KvsZfiF8l5^TNbL+`4X%#*=UmDYvvIIA5NKyzfR#CA`2~lYF@X$)K z)zHdlxDXU$5!45tCKcv~_8~`MFMcRcq$tEUB*@SeY5%_-XxzJh=jA@ezkdF2te6^6jTx-KELP%j zoQ7Sg|1q2qk&kC7%%bBZyanGuCp>@-IF#DI!ds~yM+U}uY`|++hYdt!`$DY8Rk#>? zu?dIq0sIWz&=s7?`f-&4SJakAFjq9zI^pNohDXtqmeOcuGUyp< zMgwk3cA)dGK{vV{eSSj~`S-wYrNJHdqXYA3AUkjnci}voO+Ia3fd;l3=U@*yaSmN* zCweGH(1kul=RbnJx^Z-#i97{As~^ymTtX-KCp}Qcb{trZrmhx!E`tU-Kbb|YXys-` zI??BzLBEELXdpZA&7z36(T(SuYHkED7k%KNWH%B+tVgcsOZ6NY$WU?*dS*t^j2uMY z{nuz9Cy=$`a&ju2K3|Wt=i^Qa9->9a72VuS=~HM52avHbf*!h0a3y|&_h2=vc3>Nt zsR4As*U(fCqnX%?t@r_QY~mNJ_WQp`!Bk#Fe_+b^rWRon`gyJ6<`2|!*o6b=yZa8! z*iY!VU(tmo(Ud#r`VSM@zYy*3O!c+a{r>wX7{Ci?%KMQk2DzD;edysjjCbQPB-WTj z&Sg|FyE~eLo}Fei#Y@m}E70d2K?8Ua%}^ia-N`lz?&K9T@*y7b+p&Mpl81m_Y+;M_n|66q7AJK6qlfQLRFxBT$!@uYbO89o1xDxH3fu8<( z=maa#SFt+Pd$Dk~tf#c_M&*^_^6b6YrMG8WT3fP(q3KhK3h&p9l@@l_?JoWg-}tYi diff --git a/sphinx/locale/uk_UA/LC_MESSAGES/sphinx.mo b/sphinx/locale/uk_UA/LC_MESSAGES/sphinx.mo index 6677bc576d79307239cb38e7c3149a38f47e0523..db1ce221bcd28766f234f5ed6392b3ae221af3e5 100644 GIT binary patch delta 33 ocmX@baco7<#08or`qF<<^LNTcI+lF?YBoi@ta zL&ItoXt8FNI>iVP#l&GRT8b$VILZhmEMf^!VQMfmu++Xkc2R#f&YsV6zhC$D-1nCc z_0JD~jAslQe=qW1%zs9PO8@=+9yQCMcm*@@CeBdv1hW{Fx)nH?@;tm7m*XUS95ucJ zC*nrT#?9mHp$+nqPsRIKfS+I9^VopbG1Ee`nk=&^RLn=}Y$dXWJ%$fstC!zH?cgAi1UrTr_c>PMcc?%n60PPb z$7Za;2=*aeY%@;7w=k3S?JzHvX7(W}10RtuE%X&?hd?&2xEz(@S5O(+i#k&WQGtKveldysYl5$-(2l=H4Y-2o_$O-Tf1w6y76lf=*KjhH z;ZCnVjSB26-ixECd2gfE$)lh{T8vt!Cgep6G@!oWV$=eSsB5+gwc}?|6TIN<{itzo zpfWdz>bDma=zjMIvbG&ZWn=`^?^o3A2(R&?NMdob9u8qXYQop~Pzq=}Dv%-6&Q7@( zP$|EROkp=sXCsGBvdArWYu&}D{;S3ft(6x=*p0f^ucCIk+v^XYZpEj_8ul$J@?X51 z#*x>!DX7z5!9(|b5l+YFu>s#jZRjHMvr!%q-TxcBCL#Bx&r#r?&nVf|>WDlYOU*I;P0$Gg;pk*5Q*TS7tXkZVj{F2-6ZbjYqZCHjSY+n;E zLj|@Hb>E*vO}q(}kvCCiW*2JSL#S(e)XT?0UbOHj)HOTn4OdYUT=#Msv#Z|(H;$UH z*vqAEg*y+4)fS-otwX+swR(FmS`Y-Wg^8|YS6wixYj`C3M5MGmNjXTgq}sX@sbtWY z=uWI|d8Vy16{MaHk{yZl?a6^V*;6Bl_O{e>bB6EBy_KF-RZ&?TRL-rdsU4_{U(ODK af9D(+iQYfFB!6~f=8FG0@l%EC(*FS()Z%vl delta 2055 zcmYMze`u9e7{Ku}=iSy^o6a=dCOR!8U6U)bvczEp7Lj6>Azm>NN%~>gA8C}mNl`Y< ziea=!XiZ9)pm5EKK*;L0BDwxZp@A9&Nd<*biH@l6mmctP@BO^zyytz+bDsB{Ew>EJ z$<8zm-;ww{&98;upOv;Qf4-?sDM#}NPR0{>1^ykTnv_P-uEndc1sgDrbvPfd#DzEl z3vqufj!r2{8@U+Ejcqs*`_O;~&<9GV8p0-QAe(VG9qqpj$K(BY1Fpx3 zxEnih09{Z`ZAxR9Kh<+VU%Cc~nc8t4-WcsC(G_IKqSGrl26tcw_M?e>kH#6oMVKS| zD!dQrN(F4j2hjwc$COp1^fDJ#po@ArQ7^iZeK-t1i*^Zz(;h@8I*SJS8BOT-Fh>xd zZ^l-fiN2D>$dI%u+Uqd0<5@1ua4TB+H=?~8ov?^}(?|SSp%Oa2jP991v;r5f~<^CB=5H>3hn99M z%d|4H(7iMlP5AC`DH?wzy3mIkc>g}Ii4HgZOX!NXq7S}?Cf0*p*o#xKjp+6-K@(e! z6Yy~~@OE^fchJqb7oFz|G=3RC)O7-$eZUO%8K&Jo1`b?E(Z=!28c(p`&=n}sGi zC%hF2k?uk(Qb5OTL{CMACeni&*n3$Y7iQATi!y;$bVav^%g|D+yY#L_oCx> zp@I9c5kH9j0Zf#*j9wlkd&iwa7kD0rF@MUjL+q$Q1Ga=y!s$p3DIYFC$FIO?xE|S; zsRvDPPqYt4yM)F)5&eVVFPM4bQgl>MZ#UB@w7&^G->ql`=AoN%S=?WPPW(vt3_5Nb zn#lWToCDz}(SJDFqtDM?9v$=1fp>)WM1LXLtHVdb4M^;?84b7-DOTDQ_YYz5V)X-6 o#kcE+Dr@uC=Wm*n@3^@m-`(5zYxhv~b;ZM@r&Sf(nhKTw0V;sH5C8xG From 364d38fd7432cec6c9a699a7476a8037ccb3ddfa Mon Sep 17 00:00:00 2001 From: Georg Brandl Date: Sat, 14 Feb 2009 15:11:25 +0100 Subject: [PATCH 31/38] Fix example. --- doc/config.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/config.rst b/doc/config.rst index a0151dda3..e35ca6965 100644 --- a/doc/config.rst +++ b/doc/config.rst @@ -149,7 +149,7 @@ General configuration file that is read. This is the right place to add substitutions that should be available in every file. An example:: - rest_preamble = """ + rst_epilog = """ .. |psf| replace:: Python Software Foundation """ From 06b32a712fc54d1878bb798bce8d4acf4f5f1d58 Mon Sep 17 00:00:00 2001 From: Georg Brandl Date: Sat, 14 Feb 2009 15:29:18 +0100 Subject: [PATCH 32/38] Image paths can now be absolute (like ``/images/foo.png``). They are treated as relative to the top source directory. --- CHANGES | 7 +++++-- sphinx/environment.py | 6 +++++- tests/root/subdir/images.txt | 2 ++ tests/test_build.py | 1 + 4 files changed, 13 insertions(+), 3 deletions(-) diff --git a/CHANGES b/CHANGES index d0ff30d50..bdb141f07 100644 --- a/CHANGES +++ b/CHANGES @@ -37,6 +37,9 @@ New features added the directive -- this allows you to define your document structure, but place the links yourself. + - Image paths can now be absolute (like ``/images/foo.png``). + They are treated as relative to the top source directory. + - #52: There is now a ``hlist`` directive, creating a compact list by placing distributing items into multiple columns. @@ -49,8 +52,8 @@ New features added - #23: Added a ``classmethod`` directive along with ``method`` and ``staticmethod``. - - Added a ``toctree`` variable to the templates, and the ability to - include external links in toctrees. + - Added a ``toctree`` callable to the templates, and the ability + to include external links in toctrees. * Configuration: diff --git a/sphinx/environment.py b/sphinx/environment.py index 36009f80a..d49356d1e 100644 --- a/sphinx/environment.py +++ b/sphinx/environment.py @@ -647,7 +647,11 @@ class BuildEnvironment: candidates['?'] = imguri continue # imgpath is the image path *from srcdir* - imgpath = path.normpath(path.join(docdir, imguri)) + if imguri.startswith('/') or imguri.startswith(os.sep): + # absolute path (= relative to srcdir) + imgpath = path.normpath(imguri[1:]) + else: + imgpath = path.normpath(path.join(docdir, imguri)) # set imgpath as default URI node['uri'] = imgpath if imgpath.endswith(os.extsep + '*'): diff --git a/tests/root/subdir/images.txt b/tests/root/subdir/images.txt index 33adf5b56..f2adf88d3 100644 --- a/tests/root/subdir/images.txt +++ b/tests/root/subdir/images.txt @@ -2,3 +2,5 @@ Image including source in subdir ================================ .. image:: img.* + +.. image:: /rimg.png diff --git a/tests/test_build.py b/tests/test_build.py index 9c8698c45..6e8c5c245 100644 --- a/tests/test_build.py +++ b/tests/test_build.py @@ -61,6 +61,7 @@ HTML_XPATH = { }, 'subdir/images.html': { ".//img[@src='../_images/img1.png']": '', + ".//img[@src='../_images/rimg.png']": '', }, 'includes.html': { ".//pre": u'Max Strauß', From 54f4da167716a2c60eb61401bf4121a3be19460c Mon Sep 17 00:00:00 2001 From: Georg Brandl Date: Sat, 14 Feb 2009 15:32:41 +0100 Subject: [PATCH 33/38] Add docs for absolute image paths feature. --- doc/rest.rst | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/doc/rest.rst b/doc/rest.rst index d7ef5c7bb..e6dfe0de9 100644 --- a/doc/rest.rst +++ b/doc/rest.rst @@ -212,10 +212,14 @@ reST supports an image directive, used like so:: .. image:: gnu.png (options) -When used within Sphinx, the file name given (here ``gnu.png``) must be relative -to the source file, and Sphinx will automatically copy image files over to a -subdirectory of the output directory on building (e.g. the ``_static`` directory -for HTML output.) +When used within Sphinx, the file name given (here ``gnu.png``) must either be +relative to the source file, or absolute which means that they are relative to +the top source directory. For example, the file ``sketch/spam.rst`` could refer +to the image ``images/spam.png`` as ``../images/spam.png`` or +``/images/spam.png``. + +Sphinx will automatically copy image files over to a subdirectory of the output +directory on building (e.g. the ``_static`` directory for HTML output.) Interpretation of image size options (``width`` and ``height``) is as follows: if the size has no unit or the unit is pixels, the given size will only be @@ -236,6 +240,9 @@ the former, while the HTML builder would prefer the latter. .. versionchanged:: 0.4 Added the support for file names ending in an asterisk. +.. versionchanged:: 0.6 + Image paths can now be absolute. + Footnotes --------- From b6a2d4d343b83c9b8ce8e3480f2bb64371562ca0 Mon Sep 17 00:00:00 2001 From: Georg Brandl Date: Sat, 14 Feb 2009 19:05:26 +0100 Subject: [PATCH 34/38] Add SimPy and openWNS. --- EXAMPLES | 2 ++ 1 file changed, 2 insertions(+) diff --git a/EXAMPLES b/EXAMPLES index 625e113e3..dec3c3ef1 100644 --- a/EXAMPLES +++ b/EXAMPLES @@ -31,6 +31,7 @@ included, please mail to `the Google group * NumPy: http://docs.scipy.org/doc/numpy/reference/ * ObjectListView: http://objectlistview.sourceforge.net/python * OpenLayers: http://docs.openlayers.org/ +* openWNS: http://docs.openwns.org/ * Paste: http://pythonpaste.org/script/ * Paver: http://www.blueskyonmars.com/projects/paver/ * Py on Windows: http://timgolden.me.uk/python-on-windows/ @@ -49,6 +50,7 @@ included, please mail to `the Google group * Roundup: http://www.roundup-tracker.org/ * Satchmo: http://www.satchmoproject.com/docs/svn/ * Self: http://selflanguage.org/ +* SimPy: http://simpy.sourceforge.net/ * Sphinx: http://sphinx.pocoo.org/ * SQLAlchemy: http://www.sqlalchemy.org/docs/ * Sqlkit: http://sqlkit.argolinux.org/ From a42203a24155e8818e975a1a617672fc56f14fb9 Mon Sep 17 00:00:00 2001 From: Georg Brandl Date: Sat, 14 Feb 2009 19:45:58 +0100 Subject: [PATCH 35/38] Handle footnotes in tables in LaTeX. --- sphinx/texinputs/sphinx.sty | 3 +++ sphinx/texinputs/tabulary.sty | 3 +++ 2 files changed, 6 insertions(+) diff --git a/sphinx/texinputs/sphinx.sty b/sphinx/texinputs/sphinx.sty index e5ed4d79b..f65bb170f 100644 --- a/sphinx/texinputs/sphinx.sty +++ b/sphinx/texinputs/sphinx.sty @@ -19,6 +19,9 @@ \RequirePackage{color} \RequirePackage{fancyvrb} \RequirePackage{threeparttable} +% Handle footnotes in tables. +\RequirePackage{footnote} +\makesavenoteenv{tabulary} % Redefine these colors to your liking in the preamble. \definecolor{TitleColor}{rgb}{0.126,0.263,0.361} diff --git a/sphinx/texinputs/tabulary.sty b/sphinx/texinputs/tabulary.sty index 2a96de971..ba83c0afb 100644 --- a/sphinx/texinputs/tabulary.sty +++ b/sphinx/texinputs/tabulary.sty @@ -109,6 +109,8 @@ Z \string\tymax: \the\tymax^^J}% \global\advance\TY@linewidth-#1\relax} \def\endtabulary{% \gdef\@halignto{}% + \let\TY@footnote\footnote% + \def\footnote{}% prevent footnotes from doing anything \expandafter\TY@tab\the\toks@ \crcr\omit {\xdef\TY@save@row{}% @@ -172,6 +174,7 @@ Z \message{> tymin}% \TY@checkmin \TY@count\z@ \let\TY@box\TY@box@v + \let\footnote\TY@footnote % restore footnotes {\expandafter\TY@final\the\toks@\endTY@final}% \count@\z@ \@tempswatrue From fc7249e74a46ad752394c11616d04867ededb699 Mon Sep 17 00:00:00 2001 From: Georg Brandl Date: Sat, 14 Feb 2009 19:48:07 +0100 Subject: [PATCH 36/38] Add missing file. --- tests/root/rimg.png | Bin 0 -> 67861 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 tests/root/rimg.png diff --git a/tests/root/rimg.png b/tests/root/rimg.png new file mode 100644 index 0000000000000000000000000000000000000000..72c12d13fec6b51b68a490e869011bae7f1b356c GIT binary patch literal 67861 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 aGyPvV0UwG0uR>)20000 Date: Sat, 14 Feb 2009 20:19:01 +0100 Subject: [PATCH 37/38] Recognize toctree directives that are not on section toplevel, but within block items, such as tables. --- CHANGES | 3 +++ sphinx/environment.py | 38 +++++++++++++++++++++++++------------- 2 files changed, 28 insertions(+), 13 deletions(-) diff --git a/CHANGES b/CHANGES index fcacf4853..5c467480b 100644 --- a/CHANGES +++ b/CHANGES @@ -1,6 +1,9 @@ Release 0.5.2 (in development) ============================== +* Recognize toctree directives that are not on section toplevel, + but within block items, such as tables. + * Use a new RFC base URL, since rfc.org seems down. * Fix a crash in the todolist directive when no todo items are diff --git a/sphinx/environment.py b/sphinx/environment.py index 73e5205e5..baa5da807 100644 --- a/sphinx/environment.py +++ b/sphinx/environment.py @@ -773,20 +773,32 @@ class BuildEnvironment: except ValueError: maxdepth = 0 + def traverse_in_section(node, cls): + """Like traverse(), but stay within the same section.""" + result = [] + if isinstance(node, cls): + result.append(node) + for child in node.children: + if isinstance(child, nodes.section): + continue + result.extend(traverse_in_section(child, cls)) + return result + def build_toc(node, depth=1): entries = [] - for subnode in node: - if isinstance(subnode, addnodes.toctree): - # just copy the toctree node which is then resolved - # in self.get_and_resolve_doctree - item = subnode.copy() - entries.append(item) - # do the inventory stuff - self.note_toctree(docname, subnode) + for sectionnode in node: + # find all toctree nodes in this section and add them + # to the toc (just copying the toctree node which is then + # resolved in self.get_and_resolve_doctree) + if not isinstance(sectionnode, nodes.section): + for toctreenode in traverse_in_section(sectionnode, + addnodes.toctree): + item = toctreenode.copy() + entries.append(item) + # important: do the inventory stuff + self.note_toctree(docname, toctreenode) continue - if not isinstance(subnode, nodes.section): - continue - title = subnode[0] + title = sectionnode[0] # copy the contents of the section title, but without references # and unnecessary stuff visitor = SphinxContentsFilter(document) @@ -797,7 +809,7 @@ class BuildEnvironment: # as it is the file's title anyway anchorname = '' else: - anchorname = '#' + subnode['ids'][0] + anchorname = '#' + sectionnode['ids'][0] numentries[0] += 1 reference = nodes.reference('', '', refuri=docname, anchorname=anchorname, @@ -805,7 +817,7 @@ class BuildEnvironment: para = addnodes.compact_paragraph('', '', reference) item = nodes.list_item('', para) if maxdepth == 0 or depth < maxdepth: - item += build_toc(subnode, depth+1) + item += build_toc(sectionnode, depth+1) entries.append(item) if entries: return nodes.bullet_list('', *entries) From 4e9d0f4f4b796f9cbd96609e67ea4b7670b8300b Mon Sep 17 00:00:00 2001 From: Georg Brandl Date: Sat, 14 Feb 2009 23:14:33 +0100 Subject: [PATCH 38/38] Make it more probable for docutils to report the correct source for content generated by autodoc. --- sphinx/directives/desc.py | 3 ++- sphinx/directives/other.py | 4 ++++ sphinx/ext/autodoc.py | 3 +++ sphinx/util/__init__.py | 12 ++++++++---- 4 files changed, 17 insertions(+), 5 deletions(-) diff --git a/sphinx/directives/desc.py b/sphinx/directives/desc.py index 3ffe048b9..2b741803e 100644 --- a/sphinx/directives/desc.py +++ b/sphinx/directives/desc.py @@ -428,6 +428,7 @@ def desc_directive(desctype, arguments, options, content, lineno, env = state.document.settings.env inode = addnodes.index(entries=[]) node = addnodes.desc() + node.document = state.document node['desctype'] = desctype noindex = ('noindex' in options) @@ -520,6 +521,7 @@ def desc_directive(desctype, arguments, options, content, lineno, inode['entries'].append(('single', indextext, fullname, fullname)) subnode = addnodes.desc_content() + node.append(subnode) # needed for automatic qualification of members clsname_set = False if desctype in ('class', 'exception') and names: @@ -537,7 +539,6 @@ def desc_directive(desctype, arguments, options, content, lineno, if clsname_set: env.currclass = None env.currdesc = None - node.append(subnode) return [inode, node] desc_directive.content = 1 diff --git a/sphinx/directives/other.py b/sphinx/directives/other.py index ab98ee616..a5ba589a3 100644 --- a/sphinx/directives/other.py +++ b/sphinx/directives/other.py @@ -228,6 +228,7 @@ directives.register_directive('index', index_directive) def version_directive(name, arguments, options, content, lineno, content_offset, block_text, state, state_machine): node = addnodes.versionmodified() + node.document = state.document node['type'] = name node['version'] = arguments[0] if len(arguments) == 2: @@ -333,6 +334,7 @@ def glossary_directive(name, arguments, options, content, lineno, """Glossary with cross-reference targets for :term: roles.""" env = state.document.settings.env node = addnodes.glossary() + node.document = state.document state.nested_parse(content, content_offset, node) # the content should be definition lists @@ -381,6 +383,7 @@ directives.register_directive('centered', centered_directive) def acks_directive(name, arguments, options, content, lineno, content_offset, block_text, state, state_machine): node = addnodes.acks() + node.document = state.document state.nested_parse(content, content_offset, node) if len(node.children) != 1 or not isinstance(node.children[0], nodes.bullet_list): return [state.document.reporter.warning('.. acks content is not a list', @@ -396,6 +399,7 @@ def hlist_directive(name, arguments, options, content, lineno, content_offset, block_text, state, state_machine): ncolumns = options.get('columns', 2) node = nodes.paragraph() + node.document = state.document state.nested_parse(content, content_offset, node) if len(node.children) != 1 or not isinstance(node.children[0], nodes.bullet_list): return [state.document.reporter.warning('.. hlist content is not a list', diff --git a/sphinx/ext/autodoc.py b/sphinx/ext/autodoc.py index aecf343cc..0cb2b14b1 100644 --- a/sphinx/ext/autodoc.py +++ b/sphinx/ext/autodoc.py @@ -652,9 +652,12 @@ def _auto_directive(dirname, arguments, options, content, lineno, state.memo.reporter = AutodocReporter(generator.result, state.memo.reporter) if dirname == 'automodule': node = nodes.section() + node.document = state.document # necessary so that the child nodes + # get the right source/line set nested_parse_with_titles(state, generator.result, node) else: node = nodes.paragraph() + node.document = state.document state.nested_parse(generator.result, 0, node) state.memo.reporter = old_reporter return generator.warnings + node.children diff --git a/sphinx/util/__init__.py b/sphinx/util/__init__.py index 75707d89c..944aa8d43 100644 --- a/sphinx/util/__init__.py +++ b/sphinx/util/__init__.py @@ -281,9 +281,11 @@ def nested_parse_with_titles(state, content, node): surrounding_section_level = state.memo.section_level state.memo.title_styles = [] state.memo.section_level = 0 - state.nested_parse(content, 0, node, match_titles=1) - state.memo.title_styles = surrounding_title_styles - state.memo.section_level = surrounding_section_level + try: + return state.nested_parse(content, 0, node, match_titles=1) + finally: + state.memo.title_styles = surrounding_title_styles + state.memo.section_level = surrounding_section_level def ustrftime(format, *args): @@ -374,7 +376,9 @@ def movefile(source, dest): os.rename(source, dest) -# monkey-patch Node.traverse +# monkey-patch Node.traverse to get more speed +# traverse() is called so many times during a build that it saves +# on average 20-25% overall build time! def _all_traverse(self): """Version of Node.traverse() that doesn't need a condition."""