summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeorg Brandl <georg@python.org>2011-10-07 19:18:23 +0200
committerGeorg Brandl <georg@python.org>2011-10-07 19:18:23 +0200
commit916ff0c4f7d5a850b5e463054a03ccfe4937059a (patch)
treea0691e39287334c27dbb26a71c0a22d206723f94
parent035aa3ff43ca15355bc9469a992cebac3d6bccfc (diff)
parentf435934e219d76edadbe342787d78e7c8915d20c (diff)
downloadsphinx-916ff0c4f7d5a850b5e463054a03ccfe4937059a.tar.gz
Merge with 1.0
-rw-r--r--.hgignore4
-rw-r--r--AUTHORS13
-rw-r--r--CHANGES117
-rw-r--r--EXAMPLES29
-rw-r--r--LICENSE27
-rw-r--r--MANIFEST.in2
-rw-r--r--Makefile54
-rw-r--r--README12
-rw-r--r--custom_fixers/__init__.py0
-rw-r--r--custom_fixers/fix_alt_unicode.py12
-rw-r--r--distribute_setup.py485
-rw-r--r--doc/Makefile26
-rw-r--r--doc/builders.rst32
-rw-r--r--doc/conf.py9
-rw-r--r--doc/config.rst390
-rw-r--r--doc/contents.rst2
-rw-r--r--doc/domains.rst41
-rw-r--r--doc/ext/appapi.rst26
-rw-r--r--doc/ext/autodoc.rst74
-rw-r--r--doc/ext/autosummary.rst14
-rw-r--r--doc/ext/coverage.rst14
-rw-r--r--doc/ext/doctest.rst18
-rw-r--r--doc/ext/extlinks.rst4
-rw-r--r--doc/ext/graphviz.rst21
-rw-r--r--doc/ext/inheritance.rst7
-rw-r--r--doc/ext/math.rst79
-rw-r--r--doc/extensions.rst4
-rw-r--r--doc/faq.rst126
-rw-r--r--doc/glossary.rst4
-rw-r--r--doc/intl.rst69
-rw-r--r--doc/intro.rst17
-rw-r--r--doc/invocation.rst78
-rw-r--r--doc/man/sphinx-apidoc.rst55
-rw-r--r--doc/man/sphinx-build.rst4
-rw-r--r--doc/markup/code.rst21
-rw-r--r--doc/markup/inline.rst1
-rw-r--r--doc/markup/misc.rst99
-rw-r--r--doc/markup/para.rst91
-rw-r--r--doc/markup/toctree.rst14
-rw-r--r--doc/rest.rst4
-rw-r--r--doc/themes/fullsize/pyramid.pngbin0 -> 131965 bytes
-rw-r--r--doc/themes/pyramid.pngbin0 -> 49630 bytes
-rw-r--r--doc/theming.rst28
-rw-r--r--doc/translation.pngbin0 -> 40683 bytes
-rw-r--r--doc/tutorial.rst9
-rw-r--r--doc/web/api.rst65
-rw-r--r--doc/web/quickstart.rst254
-rw-r--r--doc/web/searchadapters.rst45
-rw-r--r--doc/web/storagebackends.rst44
-rw-r--r--doc/websupport.rst16
-rw-r--r--ez_setup.py276
-rw-r--r--setup.py16
-rwxr-xr-xsphinx-apidoc.py15
-rw-r--r--sphinx/__init__.py25
-rw-r--r--sphinx/addnodes.py198
-rw-r--r--sphinx/apidoc.py313
-rw-r--r--sphinx/application.py38
-rw-r--r--sphinx/builders/__init__.py50
-rw-r--r--sphinx/builders/changes.py3
-rw-r--r--sphinx/builders/devhelp.py1
-rw-r--r--sphinx/builders/epub.py83
-rw-r--r--sphinx/builders/gettext.py130
-rw-r--r--sphinx/builders/html.py98
-rw-r--r--sphinx/builders/htmlhelp.py1
-rw-r--r--sphinx/builders/linkcheck.py179
-rw-r--r--sphinx/builders/qthelp.py14
-rw-r--r--sphinx/builders/texinfo.py227
-rw-r--r--sphinx/builders/websupport.py155
-rw-r--r--sphinx/cmdline.py10
-rw-r--r--sphinx/config.py73
-rw-r--r--sphinx/directives/code.py51
-rw-r--r--sphinx/directives/other.py71
-rw-r--r--sphinx/domains/__init__.py29
-rw-r--r--sphinx/domains/c.py2
-rw-r--r--sphinx/domains/cpp.py37
-rw-r--r--sphinx/domains/javascript.py6
-rw-r--r--sphinx/domains/python.py107
-rw-r--r--sphinx/domains/rst.py9
-rw-r--r--sphinx/domains/std.py122
-rw-r--r--sphinx/environment.py458
-rw-r--r--sphinx/ext/autodoc.py334
-rw-r--r--sphinx/ext/autosummary/__init__.py119
-rw-r--r--sphinx/ext/autosummary/generate.py21
-rw-r--r--sphinx/ext/coverage.py29
-rw-r--r--sphinx/ext/doctest.py88
-rw-r--r--sphinx/ext/graphviz.py146
-rw-r--r--sphinx/ext/inheritance_diagram.py53
-rw-r--r--sphinx/ext/intersphinx.py24
-rw-r--r--sphinx/ext/mathbase.py50
-rw-r--r--sphinx/ext/mathjax.py68
-rw-r--r--sphinx/ext/oldcmarkup.py1
-rw-r--r--sphinx/ext/pngmath.py29
-rw-r--r--sphinx/ext/todo.py3
-rw-r--r--sphinx/ext/viewcode.py8
-rw-r--r--sphinx/highlighting.py87
-rw-r--r--sphinx/jinja2glue.py16
-rw-r--r--sphinx/locale/__init__.py41
-rw-r--r--sphinx/locale/bn/LC_MESSAGES/sphinx.js2
-rw-r--r--sphinx/locale/bn/LC_MESSAGES/sphinx.mobin12509 -> 12147 bytes
-rw-r--r--sphinx/locale/bn/LC_MESSAGES/sphinx.po697
-rw-r--r--sphinx/locale/ca/LC_MESSAGES/sphinx.js2
-rw-r--r--sphinx/locale/ca/LC_MESSAGES/sphinx.mobin9378 -> 9093 bytes
-rw-r--r--sphinx/locale/ca/LC_MESSAGES/sphinx.po360
-rw-r--r--sphinx/locale/cs/LC_MESSAGES/sphinx.js2
-rw-r--r--sphinx/locale/cs/LC_MESSAGES/sphinx.mobin9067 -> 8687 bytes
-rw-r--r--sphinx/locale/cs/LC_MESSAGES/sphinx.po363
-rw-r--r--sphinx/locale/da/LC_MESSAGES/sphinx.js2
-rw-r--r--sphinx/locale/da/LC_MESSAGES/sphinx.mobin8668 -> 9357 bytes
-rw-r--r--sphinx/locale/da/LC_MESSAGES/sphinx.po670
-rw-r--r--sphinx/locale/de/LC_MESSAGES/sphinx.js2
-rw-r--r--sphinx/locale/de/LC_MESSAGES/sphinx.mobin10038 -> 9672 bytes
-rw-r--r--sphinx/locale/de/LC_MESSAGES/sphinx.po349
-rw-r--r--sphinx/locale/es/LC_MESSAGES/sphinx.js2
-rw-r--r--sphinx/locale/es/LC_MESSAGES/sphinx.mobin8121 -> 7603 bytes
-rw-r--r--sphinx/locale/es/LC_MESSAGES/sphinx.po353
-rw-r--r--sphinx/locale/et/LC_MESSAGES/sphinx.js1
-rw-r--r--sphinx/locale/et/LC_MESSAGES/sphinx.mobin0 -> 9137 bytes
-rw-r--r--sphinx/locale/et/LC_MESSAGES/sphinx.po770
-rw-r--r--sphinx/locale/fa/LC_MESSAGES/sphinx.js1
-rw-r--r--sphinx/locale/fa/LC_MESSAGES/sphinx.mobin0 -> 8588 bytes
-rw-r--r--sphinx/locale/fa/LC_MESSAGES/sphinx.po779
-rw-r--r--sphinx/locale/fi/LC_MESSAGES/sphinx.js2
-rw-r--r--sphinx/locale/fi/LC_MESSAGES/sphinx.mobin9102 -> 8836 bytes
-rw-r--r--sphinx/locale/fi/LC_MESSAGES/sphinx.po349
-rw-r--r--sphinx/locale/fr/LC_MESSAGES/sphinx.js2
-rw-r--r--sphinx/locale/fr/LC_MESSAGES/sphinx.mobin8938 -> 8513 bytes
-rw-r--r--sphinx/locale/fr/LC_MESSAGES/sphinx.po374
-rw-r--r--sphinx/locale/hr/LC_MESSAGES/sphinx.js2
-rw-r--r--sphinx/locale/hr/LC_MESSAGES/sphinx.mobin9195 -> 8859 bytes
-rw-r--r--sphinx/locale/hr/LC_MESSAGES/sphinx.po379
-rw-r--r--sphinx/locale/it/LC_MESSAGES/sphinx.js2
-rw-r--r--sphinx/locale/it/LC_MESSAGES/sphinx.mobin9461 -> 9100 bytes
-rw-r--r--sphinx/locale/it/LC_MESSAGES/sphinx.po358
-rw-r--r--sphinx/locale/ja/LC_MESSAGES/sphinx.js2
-rw-r--r--sphinx/locale/ja/LC_MESSAGES/sphinx.mobin9950 -> 10186 bytes
-rw-r--r--sphinx/locale/ja/LC_MESSAGES/sphinx.po433
-rw-r--r--sphinx/locale/ko/LC_MESSAGES/sphinx.js1
-rw-r--r--sphinx/locale/ko/LC_MESSAGES/sphinx.mobin0 -> 7126 bytes
-rw-r--r--sphinx/locale/ko/LC_MESSAGES/sphinx.po777
-rw-r--r--sphinx/locale/lt/LC_MESSAGES/sphinx.js2
-rw-r--r--sphinx/locale/lt/LC_MESSAGES/sphinx.mobin10244 -> 9845 bytes
-rw-r--r--sphinx/locale/lt/LC_MESSAGES/sphinx.po349
-rw-r--r--sphinx/locale/lv/LC_MESSAGES/sphinx.js1
-rw-r--r--sphinx/locale/lv/LC_MESSAGES/sphinx.mobin0 -> 9651 bytes
-rw-r--r--sphinx/locale/lv/LC_MESSAGES/sphinx.po771
-rw-r--r--sphinx/locale/ne/LC_MESSAGES/sphinx.js1
-rw-r--r--sphinx/locale/ne/LC_MESSAGES/sphinx.mobin0 -> 12378 bytes
-rw-r--r--sphinx/locale/ne/LC_MESSAGES/sphinx.po768
-rw-r--r--sphinx/locale/nl/LC_MESSAGES/sphinx.js2
-rw-r--r--sphinx/locale/nl/LC_MESSAGES/sphinx.mobin9352 -> 9096 bytes
-rw-r--r--sphinx/locale/nl/LC_MESSAGES/sphinx.po418
-rw-r--r--sphinx/locale/pl/LC_MESSAGES/sphinx.js2
-rw-r--r--sphinx/locale/pl/LC_MESSAGES/sphinx.mobin9370 -> 9551 bytes
-rw-r--r--sphinx/locale/pl/LC_MESSAGES/sphinx.po468
-rw-r--r--sphinx/locale/pt_BR/LC_MESSAGES/sphinx.js2
-rw-r--r--sphinx/locale/pt_BR/LC_MESSAGES/sphinx.mobin10252 -> 9663 bytes
-rw-r--r--sphinx/locale/pt_BR/LC_MESSAGES/sphinx.po399
-rw-r--r--sphinx/locale/ru/LC_MESSAGES/sphinx.js2
-rw-r--r--sphinx/locale/ru/LC_MESSAGES/sphinx.mobin11308 -> 10794 bytes
-rw-r--r--sphinx/locale/ru/LC_MESSAGES/sphinx.po360
-rw-r--r--sphinx/locale/sl/LC_MESSAGES/sphinx.js2
-rw-r--r--sphinx/locale/sl/LC_MESSAGES/sphinx.mobin9146 -> 8883 bytes
-rw-r--r--sphinx/locale/sl/LC_MESSAGES/sphinx.po359
-rw-r--r--sphinx/locale/sphinx.pot346
-rw-r--r--sphinx/locale/sv/LC_MESSAGES/sphinx.js1
-rw-r--r--sphinx/locale/sv/LC_MESSAGES/sphinx.mobin0 -> 9153 bytes
-rw-r--r--sphinx/locale/sv/LC_MESSAGES/sphinx.po766
-rw-r--r--sphinx/locale/tr/LC_MESSAGES/sphinx.js2
-rw-r--r--sphinx/locale/tr/LC_MESSAGES/sphinx.mobin10111 -> 9718 bytes
-rw-r--r--sphinx/locale/tr/LC_MESSAGES/sphinx.po405
-rw-r--r--sphinx/locale/uk_UA/LC_MESSAGES/sphinx.js2
-rw-r--r--sphinx/locale/uk_UA/LC_MESSAGES/sphinx.mobin10983 -> 10486 bytes
-rw-r--r--sphinx/locale/uk_UA/LC_MESSAGES/sphinx.po360
-rw-r--r--sphinx/locale/zh_CN/LC_MESSAGES/sphinx.js2
-rw-r--r--sphinx/locale/zh_CN/LC_MESSAGES/sphinx.mobin8755 -> 8592 bytes
-rw-r--r--sphinx/locale/zh_CN/LC_MESSAGES/sphinx.po362
-rw-r--r--sphinx/locale/zh_TW/LC_MESSAGES/sphinx.js2
-rw-r--r--sphinx/locale/zh_TW/LC_MESSAGES/sphinx.mobin8934 -> 8398 bytes
-rw-r--r--sphinx/locale/zh_TW/LC_MESSAGES/sphinx.po349
-rw-r--r--sphinx/pycode/__init__.py51
-rw-r--r--sphinx/pycode/nodes.py2
-rw-r--r--sphinx/pycode/pgen2/literals.py2
-rw-r--r--sphinx/pycode/pgen2/tokenize.py4
-rw-r--r--sphinx/pygments_styles.py96
-rw-r--r--sphinx/quickstart.py359
-rw-r--r--sphinx/roles.py51
-rw-r--r--sphinx/search/__init__.py (renamed from sphinx/search.py)154
-rw-r--r--sphinx/search/en.py244
-rw-r--r--sphinx/search/ja.py273
-rw-r--r--sphinx/setup_command.py3
-rw-r--r--sphinx/texinputs/sphinx.sty18
-rw-r--r--sphinx/themes/agogo/layout.html3
-rw-r--r--sphinx/themes/agogo/static/agogo.css_t5
-rw-r--r--sphinx/themes/basic/genindex-single.html49
-rw-r--r--sphinx/themes/basic/genindex.html62
-rw-r--r--sphinx/themes/basic/layout.html45
-rw-r--r--sphinx/themes/basic/searchresults.html36
-rw-r--r--sphinx/themes/basic/static/ajax-loader.gifbin0 -> 673 bytes
-rw-r--r--sphinx/themes/basic/static/basic.css_t (renamed from sphinx/themes/basic/static/basic.css)7
-rw-r--r--sphinx/themes/basic/static/comment-bright.pngbin0 -> 3500 bytes
-rw-r--r--sphinx/themes/basic/static/comment-close.pngbin0 -> 3578 bytes
-rw-r--r--sphinx/themes/basic/static/comment.pngbin0 -> 3445 bytes
-rw-r--r--sphinx/themes/basic/static/doctools.js8
-rw-r--r--sphinx/themes/basic/static/down-pressed.pngbin0 -> 368 bytes
-rw-r--r--sphinx/themes/basic/static/down.pngbin0 -> 363 bytes
-rw-r--r--sphinx/themes/basic/static/searchtools.js_t (renamed from sphinx/themes/basic/static/searchtools.js)319
-rw-r--r--sphinx/themes/basic/static/underscore.js7
-rw-r--r--sphinx/themes/basic/static/up-pressed.pngbin0 -> 372 bytes
-rw-r--r--sphinx/themes/basic/static/up.pngbin0 -> 363 bytes
-rw-r--r--sphinx/themes/basic/static/websupport.js808
-rw-r--r--sphinx/themes/basic/theme.conf1
-rw-r--r--sphinx/themes/default/static/default.css_t4
-rw-r--r--sphinx/themes/default/static/sidebar.js3
-rw-r--r--sphinx/themes/epub/epub-cover.html24
-rw-r--r--sphinx/themes/nature/static/nature.css_t2
-rw-r--r--sphinx/themes/pyramid/layout.html24
-rw-r--r--sphinx/themes/pyramid/static/dialog-note.pngbin0 -> 1582 bytes
-rw-r--r--sphinx/themes/pyramid/static/dialog-seealso.pngbin0 -> 1502 bytes
-rw-r--r--sphinx/themes/pyramid/static/dialog-topic.pngbin0 -> 1910 bytes
-rw-r--r--sphinx/themes/pyramid/static/dialog-warning.pngbin0 -> 1391 bytes
-rw-r--r--sphinx/themes/pyramid/static/epub.css310
-rw-r--r--sphinx/themes/pyramid/static/footerbg.pngbin0 -> 333 bytes
-rw-r--r--sphinx/themes/pyramid/static/headerbg.pngbin0 -> 203 bytes
-rw-r--r--sphinx/themes/pyramid/static/ie6.css7
-rw-r--r--sphinx/themes/pyramid/static/middlebg.pngbin0 -> 2797 bytes
-rw-r--r--sphinx/themes/pyramid/static/pyramid.css_t323
-rw-r--r--sphinx/themes/pyramid/static/transparent.gifbin0 -> 49 bytes
-rw-r--r--sphinx/themes/pyramid/theme.conf4
-rw-r--r--sphinx/themes/sphinxdoc/static/sphinxdoc.css_t (renamed from sphinx/themes/sphinxdoc/static/sphinxdoc.css)4
-rw-r--r--sphinx/themes/traditional/static/traditional.css_t (renamed from sphinx/themes/traditional/static/traditional.css)36
-rw-r--r--sphinx/theming.py25
-rw-r--r--sphinx/util/__init__.py84
-rw-r--r--sphinx/util/compat.py1
-rw-r--r--sphinx/util/docstrings.py32
-rw-r--r--sphinx/util/inspect.py47
-rw-r--r--sphinx/util/jsdump.py4
-rw-r--r--sphinx/util/jsonimpl.py2
-rw-r--r--sphinx/util/matching.py11
-rw-r--r--sphinx/util/nodes.py123
-rw-r--r--sphinx/util/osutil.py25
-rw-r--r--sphinx/util/png.py14
-rw-r--r--sphinx/util/pycompat.py113
-rw-r--r--sphinx/util/texescape.py5
-rw-r--r--sphinx/util/websupport.py12
-rw-r--r--sphinx/versioning.py127
-rw-r--r--sphinx/websupport/__init__.py456
-rw-r--r--sphinx/websupport/errors.py26
-rw-r--r--sphinx/websupport/search/__init__.py126
-rw-r--r--sphinx/websupport/search/nullsearch.py24
-rw-r--r--sphinx/websupport/search/whooshsearch.py59
-rw-r--r--sphinx/websupport/search/xapiansearch.py81
-rw-r--r--sphinx/websupport/storage/__init__.py115
-rw-r--r--sphinx/websupport/storage/differ.py85
-rw-r--r--sphinx/websupport/storage/sqlalchemy_db.py208
-rw-r--r--sphinx/websupport/storage/sqlalchemystorage.py177
-rw-r--r--sphinx/writers/html.py81
-rw-r--r--sphinx/writers/latex.py179
-rw-r--r--sphinx/writers/manpage.py19
-rw-r--r--sphinx/writers/texinfo.py1372
-rw-r--r--sphinx/writers/text.py36
-rw-r--r--sphinx/writers/websupport.py46
-rwxr-xr-xtests/coverage.py31
-rw-r--r--tests/etree13/ElementTree.py14
-rw-r--r--tests/path.py1021
-rw-r--r--tests/root/autosummary.txt26
-rw-r--r--tests/root/bom.po12
-rw-r--r--tests/root/conf.py7
-rw-r--r--tests/root/contents.txt1
-rw-r--r--tests/root/doctest.txt47
-rw-r--r--tests/root/literal.inc2
-rw-r--r--tests/root/markup.txt35
-rw-r--r--tests/root/subdir.po9
-rw-r--r--tests/root/versioning/added.txt20
-rw-r--r--tests/root/versioning/deleted.txt12
-rw-r--r--tests/root/versioning/deleted_end.txt11
-rw-r--r--tests/root/versioning/index.txt13
-rw-r--r--tests/root/versioning/insert.txt18
-rw-r--r--tests/root/versioning/insert_beginning.txt18
-rw-r--r--tests/root/versioning/insert_similar.txt17
-rw-r--r--tests/root/versioning/modified.txt17
-rw-r--r--tests/root/versioning/original.txt15
-rwxr-xr-xtests/run.py28
-rw-r--r--tests/test_application.py2
-rw-r--r--tests/test_autodoc.py78
-rw-r--r--tests/test_autosummary.py12
-rw-r--r--tests/test_build_gettext.py81
-rw-r--r--tests/test_build_html.py24
-rw-r--r--tests/test_build_latex.py4
-rw-r--r--tests/test_build_texinfo.py67
-rw-r--r--tests/test_config.py19
-rw-r--r--tests/test_coverage.py4
-rw-r--r--tests/test_cpp_domain.py23
-rw-r--r--tests/test_doctest.py10
-rw-r--r--tests/test_env.py10
-rw-r--r--tests/test_intersphinx.py41
-rw-r--r--tests/test_intl.py65
-rw-r--r--tests/test_markup.py13
-rw-r--r--tests/test_quickstart.py46
-rw-r--r--tests/test_search.py5
-rw-r--r--tests/test_searchadapters.py79
-rw-r--r--tests/test_theming.py3
-rw-r--r--tests/test_versioning.py115
-rw-r--r--tests/test_websupport.py275
-rw-r--r--tests/util.py52
-rw-r--r--tox.ini15
-rwxr-xr-xutils/check_sources.py115
-rw-r--r--utils/convert.py43
-rwxr-xr-xutils/reindent.py80
308 files changed, 21958 insertions, 7773 deletions
diff --git a/.hgignore b/.hgignore
index 70ea36a5..45ecebc3 100644
--- a/.hgignore
+++ b/.hgignore
@@ -15,3 +15,7 @@
^env/
\.DS_Store$
~$
+^utils/.*3\.py$
+^distribute-
+^tests/root/_build/*
+^tests/root/generated/*
diff --git a/AUTHORS b/AUTHORS
index 10120c7b..a24d6a54 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -8,28 +8,39 @@ Other contributors, listed alphabetically, are:
* Andi Albrecht -- agogo theme
* Henrique Bastos -- SVG support for graphviz extension
* Daniel Bültmann -- todo extension
+* Etienne Desautels -- apidoc module
* Michael Droettboom -- inheritance_diagram extension
* Charles Duffy -- original graphviz extension
+* Kevin Dunn -- MathJax extension
* Josip Dzolonga -- coverage builder
* Horst Gutmann -- internationalization support
* Martin Hans -- autodoc improvements
+* Doug Hellmann -- graphviz improvements
* Dave Kuhlman -- original LaTeX writer
+* Blaise Laflamme -- pyramid theme
* Thomas Lamb -- linkcheck builder
+* Łukasz Langa -- partial support for autodoc
+* Robert Lehmann -- gettext builder (GSOC project)
* Dan MacKinlay -- metadata fixes
* Martin Mahner -- nature theme
* Will Maier -- directory HTML builder
+* Jacob Mason -- websupport library (GSOC project)
* Roland Meister -- epub builder
* Ezio Melotti -- collapsible sidebar JavaScript
-* Daniel Neuhäuser -- JavaScript domain
+* Daniel Neuhäuser -- JavaScript domain, Python 3 support (GSOC)
* Christopher Perkins -- autosummary integration
* Benjamin Peterson -- unittests
* T. Powers -- HTML output improvements
* Stefan Seefeld -- toctree improvements
+* Shibukawa Yoshiki -- pluggable search API and Japanese search
* Antonio Valentino -- qthelp builder
* Pauli Virtanen -- autodoc improvements, autosummary extension
* Stefan van der Walt -- autosummary extension
+* Thomas Waldmann -- apidoc module fixes
+* John Waltman -- Texinfo builder
* Barry Warsaw -- setup command improvements
* Sebastian Wiesner -- image handling, distutils support
+* Joel Wurtz -- cellspanning support in LaTeX
Many thanks for all contributions!
diff --git a/CHANGES b/CHANGES
index 02547e32..90f3fc44 100644
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,120 @@
+Release 1.1 (in development)
+============================
+
+Incompatible changes
+--------------------
+
+* The :rst:dir:`py:module` directive doesn't output its ``platform`` option
+ value anymore. (It was the only thing that the directive did output, and
+ therefore quite inconsistent.)
+
+* Removed support for old dependency versions; requirements are now:
+
+ - Pygments >= 1.2
+ - Docutils >= 0.7
+ - Jinja2 >= 2.3
+
+Features added
+--------------
+
+* Added Python 3.x support.
+
+* New builders and subsystems:
+
+ - Added a Texinfo builder.
+ - Added i18n support for content, a ``gettext`` builder and related
+ utilities.
+ - Added the ``websupport`` library and builder.
+ - #98: Added a ``sphinx-apidoc`` script that autogenerates a hierarchy
+ of source files containing autodoc directives to document modules
+ and packages.
+ - #273: Add an API for adding full-text search support for languages
+ other than English. Add support for Japanese.
+
+* Markup:
+
+ - #138: Added an :rst:role:`index` role, to make inline index entries.
+ - #454: Added more index markup capabilities: marking see/seealso entries,
+ and main entries for a given key.
+ - #460: Allowed limiting the depth of section numbers for HTML using the
+ :rst:dir:`toctree`\'s ``numbered`` option.
+ - #586: Implemented improved :rst:dir:`glossary` markup which allows
+ multiple terms per definition.
+ - #478: Added :rst:dir:`py:decorator` directive to describe decorators.
+ - C++ domain now supports array definitions.
+ - C++ domain now supports doc fields (``:param x:`` inside directives).
+ - Section headings in :rst:dir:`only` directives are now correctly
+ handled.
+ - Added ``emphasize-lines`` option to source code directives.
+
+* HTML builder:
+
+ - Added ``pyramid`` theme.
+ - #559: :confval:`html_add_permalinks` is now a string giving the
+ text to display in permalinks.
+ - #259: HTML table rows now have even/odd CSS classes to enable
+ "Zebra styling".
+ - #554: Add theme option ``sidebarwidth`` to the basic theme.
+
+* Other builders:
+
+ - #516: Added new value of the :confval:`latex_show_urls` option to
+ show the URLs in footnotes.
+ - #209: Added :confval:`text_newlines` and :confval:`text_sectionchars`
+ config values.
+ - Added :confval:`man_show_urls` config value.
+ - #472: linkcheck builder: Check links in parallel, use HTTP HEAD
+ requests and allow configuring the timeout. New config values:
+ :confval:`linkcheck_timeout` and :confval:`linkcheck_workers`.
+ - #521: Added :confval:`linkcheck_ignore` config value.
+ - #28: Support row/colspans in tables in the LaTeX builder.
+
+* Configuration and extensibility:
+
+ - #537: Added :confval:`nitpick_ignore`.
+ - #306: Added :event:`env-get-outdated` event.
+ - :meth:`.Application.add_stylesheet` now accepts full URIs.
+
+* Autodoc:
+
+ - #564: Add :confval:`autodoc_docstring_signature`. When enabled (the
+ default), autodoc retrieves the signature from the first line of the
+ docstring, if it is found there.
+ - #176: Provide ``private-members`` option for autodoc directives.
+ - #520: Provide ``special-members`` option for autodoc directives.
+ - #431: Doc comments for attributes can now be given on the same line
+ as the assignment.
+ - #437: autodoc now shows values of class data attributes.
+ - autodoc now supports documenting the signatures of
+ ``functools.partial`` objects.
+
+* Other extensions:
+
+ - Added the :mod:`sphinx.ext.mathjax` extension.
+ - #443: Allow referencing external graphviz files.
+ - Added ``inline`` option to graphviz directives, and fixed the
+ default (block-style) in LaTeX output.
+ - #590: Added ``caption`` option to graphviz directives.
+ - #553: Added :rst:dir:`testcleanup` blocks in the doctest extension.
+ - #594: :confval:`trim_doctest_flags` now also removes ``<BLANKLINE>``
+ indicators.
+ - #367: Added automatic exclusion of hidden members in inheritance
+ diagrams, and an option to selectively enable it.
+ - Added :confval:`pngmath_add_tooltips`.
+ - The math extension displaymath directives now support ``name`` in
+ addition to ``label`` for giving the equation label, for compatibility
+ with Docutils.
+
+* New locales:
+
+ - #221: Added Swedish locale.
+ - #526: Added Iranian locale.
+ - #694: Added Latvian locale.
+ - Added Nepali locale.
+ - #714: Added Korean locale.
+ - #766: Added Estonian locale.
+
+
Release 1.0.9 (in development)
==============================
diff --git a/EXAMPLES b/EXAMPLES
index 76e03a3b..bb5712d4 100644
--- a/EXAMPLES
+++ b/EXAMPLES
@@ -15,7 +15,7 @@ Documentation using the default theme
* APSW: http://apidoc.apsw.googlecode.com/hg/index.html
* ASE: https://wiki.fysik.dtu.dk/ase/
* boostmpi: http://documen.tician.de/boostmpi/
-* Calibre: http://calibre.kovidgoyal.net/user_manual/
+* Calibre: http://calibre-ebook.com/user_manual/
* CodePy: http://documen.tician.de/codepy/
* Cython: http://docs.cython.org/
* C\\C++ Python language binding project: http://language-binding.net/index.html
@@ -23,25 +23,26 @@ Documentation using the default theme
* Director: http://packages.python.org/director/
* Dirigible: http://www.projectdirigible.com/documentation/
* Elemental: http://elemental.googlecode.com/hg/doc/build/html/index.html
-* F2py: http://www.f2py.org/html/
+* F2py: http://f2py.sourceforge.net/docs/
* GeoDjango: http://geodjango.org/docs/
* Genomedata: http://noble.gs.washington.edu/proj/genomedata/doc/1.2.2/genomedata.html
* gevent: http://www.gevent.org/
* Google Wave API: http://wave-robot-python-client.googlecode.com/svn/trunk/pydocs/index.html
* GSL Shell: http://www.nongnu.org/gsl-shell/
+* Heapkeeper: http://heapkeeper.org/
* Hands-on Python Tutorial: http://anh.cs.luc.edu/python/hands-on/3.1/handsonHtml/
* Hedge: http://documen.tician.de/hedge/
* Kaa: http://doc.freevo.org/api/kaa/
* Leo: http://webpages.charter.net/edreamleo/front.html
-* Lino: http://lino.saffre-rumma.ee/
+* Lino: http://lino.saffre-rumma.net/
* MeshPy: http://documen.tician.de/meshpy/
* mpmath: http://mpmath.googlecode.com/svn/trunk/doc/build/index.html
* OpenEXR: http://excamera.com/articles/26/doc/index.html
* OpenGDA: http://www.opengda.org/gdadoc/html/
* openWNS: http://docs.openwns.org/
* Paste: http://pythonpaste.org/script/
-* Paver: http://www.blueskyonmars.com/projects/paver/
-* Pyccuracy: http://www.pyccuracy.org/
+* Paver: http://paver.github.com/paver/
+* Pyccuracy: https://github.com/heynemann/pyccuracy/wiki/
* PyCuda: http://documen.tician.de/pycuda/
* Pyevolve: http://pyevolve.sourceforge.net/
* Pylo: http://documen.tician.de/pylo/
@@ -74,10 +75,9 @@ Documentation using a customized version of the default theme
* IFM: http://fluffybunny.memebot.com/ifm-docs/index.html
* LEPL: http://www.acooke.org/lepl/
* Mayavi: http://code.enthought.com/projects/mayavi/docs/development/html/mayavi
-* NOC: http://trac.nocproject.org/trac/wiki/NocGuide
+* NOC: http://redmine.nocproject.org/projects/noc
* NumPy: http://docs.scipy.org/doc/numpy/reference/
* Peach^3: http://peach3.nl/doc/latest/userdoc/
-* Py on Windows: http://timgolden.me.uk/python-on-windows/
* PyLit: http://pylit.berlios.de/
* Sage: http://sagemath.org/doc/
* SciPy: http://docs.scipy.org/doc/scipy/reference/
@@ -92,7 +92,7 @@ Documentation using a customized version of the default theme
Documentation using the sphinxdoc theme
---------------------------------------
-* Fityk: http://www.unipress.waw.pl/fityk/
+* Fityk: http://fityk.nieto.pl/
* MapServer: http://mapserver.org/
* Matplotlib: http://matplotlib.sourceforge.net/
* Music21: http://mit.edu/music21/doc/html/contents.html
@@ -103,8 +103,8 @@ Documentation using the sphinxdoc theme
* Pysparse: http://pysparse.sourceforge.net/
* PyTango:
http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-* Reteisi: http://docs.argolinux.org/reteisi/
-* Satchmo: http://www.satchmoproject.com/docs/svn/
+* Reteisi: http://www.reteisi.org/contents.html
+* Satchmo: http://www.satchmoproject.com/docs/dev/
* Sphinx: http://sphinx.pocoo.org/
* Sqlkit: http://sqlkit.argolinux.org/
* Tau: http://www.tango-controls.org/static/tau/latest/doc/html/index.html
@@ -115,9 +115,9 @@ Documentation using the sphinxdoc theme
Documentation using another builtin theme
-----------------------------------------
-* C/C++ Development with Eclipse: http://book.dehlia.in/c-cpp-eclipse/ (agogo)
+* C/C++ Development with Eclipse: http://eclipsebook.in/ (agogo)
* Distribute: http://packages.python.org/distribute/ (nature)
-* Jinja: http://jinja.pocoo.org/2/documentation/ (scrolls)
+* Jinja: http://jinja.pocoo.org/ (scrolls)
* jsFiddle: http://doc.jsfiddle.net/ (nature)
* pip: http://pip.openplans.org/ (nature)
* Programmieren mit PyGTK und Glade (German):
@@ -157,10 +157,11 @@ Documentation using a custom theme/integrated in a site
* Roundup: http://www.roundup-tracker.org/
* Selenium: http://seleniumhq.org/docs/
* Self: http://selflanguage.org/
+* Tablib: http://tablib.org/
* SQLAlchemy: http://www.sqlalchemy.org/docs/
* tinyTiM: http://tinytim.sourceforge.net/docs/2.0/
* tipfy: http://www.tipfy.org/docs/
-* Werkzeug: http://werkzeug.pocoo.org/documentation/dev/
+* Werkzeug: http://werkzeug.pocoo.org/docs/
* WFront: http://discorporate.us/projects/WFront/
@@ -169,7 +170,7 @@ Homepages and other non-documentation sites
* Applied Mathematics at the Stellenbosch University: http://dip.sun.ac.za/
* A personal page: http://www.dehlia.in/
-* Benoit Boissinot: http://perso.ens-lyon.fr/benoit.boissinot/
+* Benoit Boissinot: http://bboissin.appspot.com/
* lunarsite: http://lunaryorn.de/
* Red Hot Chili Python: http://redhotchilipython.com/
* The Wine Cellar Book: http://www.thewinecellarbook.com/doc/en/
diff --git a/LICENSE b/LICENSE
index fa1ef995..260c20fb 100644
--- a/LICENSE
+++ b/LICENSE
@@ -217,3 +217,30 @@ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
----------------------------------------------------------------------
+
+The included Underscore JavaScript library is available under the MIT
+license:
+
+----------------------------------------------------------------------
+Copyright (c) 2009 Jeremy Ashkenas, DocumentCloud
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
diff --git a/MANIFEST.in b/MANIFEST.in
index 25cbc334..cfc44c17 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -7,7 +7,7 @@ include TODO
include babel.cfg
include Makefile
-include ez_setup.py
+include distribute_setup.py
include sphinx-autogen.py
include sphinx-build.py
include sphinx-quickstart.py
diff --git a/Makefile b/Makefile
index 7057a715..128b2c80 100644
--- a/Makefile
+++ b/Makefile
@@ -1,36 +1,64 @@
PYTHON ?= python
-export PYTHONPATH = $(shell echo "$$PYTHONPATH"):./sphinx
+.PHONY: all check clean clean-pyc clean-patchfiles clean-backupfiles \
+ clean-generated pylint reindent test covertest build convert-utils
-.PHONY: all check clean clean-pyc clean-patchfiles pylint reindent test
+DONT_CHECK = -i build -i dist -i sphinx/style/jquery.js \
+ -i sphinx/pycode/pgen2 -i sphinx/util/smartypants.py \
+ -i .ropeproject -i doc/_build -i tests/path.py \
+ -i tests/coverage.py -i env -i utils/convert.py \
+ -i sphinx/search/ja.py \
+ -i utils/reindent3.py -i utils/check_sources3.py -i .tox
-all: clean-pyc check test
+all: clean-pyc clean-backupfiles check test
+ifeq ($(PYTHON), python3)
+check: convert-utils
+ @$(PYTHON) utils/check_sources3.py $(DONT_CHECK) .
+else
check:
- @$(PYTHON) utils/check_sources.py -i build -i dist -i sphinx/style/jquery.js \
- -i sphinx/pycode/pgen2 -i sphinx/util/smartypants.py -i .ropeproject \
- -i doc/_build -i ez_setup.py -i tests/path.py -i tests/coverage.py \
- -i env -i .tox .
+ @$(PYTHON) utils/check_sources.py $(DONT_CHECK) .
+endif
-clean: clean-pyc clean-patchfiles
+clean: clean-pyc clean-patchfiles clean-backupfiles clean-generated
clean-pyc:
find . -name '*.pyc' -exec rm -f {} +
find . -name '*.pyo' -exec rm -f {} +
- find . -name '*~' -exec rm -f {} +
clean-patchfiles:
find . -name '*.orig' -exec rm -f {} +
find . -name '*.rej' -exec rm -f {} +
+clean-backupfiles:
+ find . -name '*~' -exec rm -f {} +
+ find . -name '*.bak' -exec rm -f {} +
+
+clean-generated:
+ rm -f utils/*3.py*
+
pylint:
@pylint --rcfile utils/pylintrc sphinx
+ifeq ($(PYTHON), python3)
+reindent: convert-utils
+ @$(PYTHON) utils/reindent3.py -r -n .
+else
reindent:
- @$(PYTHON) utils/reindent.py -r -B .
+ @$(PYTHON) utils/reindent.py -r -n .
+endif
-test:
+test: build
@cd tests; $(PYTHON) run.py -d -m '^[tT]est' $(TEST)
-covertest:
- @cd tests; $(PYTHON) run.py -d -m '^[tT]est' --with-coverage --cover-package=sphinx $(TEST)
+covertest: build
+ @cd tests; $(PYTHON) run.py -d -m '^[tT]est' --with-coverage \
+ --cover-package=sphinx $(TEST)
+
+build:
+ @$(PYTHON) setup.py build
+
+ifeq ($(PYTHON), python3)
+convert-utils:
+ @python3 utils/convert.py -i utils/convert.py utils/
+endif
diff --git a/README b/README
index bb2dea9d..e31d6b93 100644
--- a/README
+++ b/README
@@ -26,6 +26,18 @@ Then, direct your browser to ``_build/html/index.html``.
Or read them online at <http://sphinx.pocoo.org/>.
+Testing
+=======
+
+To run the tests with the interpreter available as ``python``, use::
+
+ make test
+
+If you want to use a different interpreter, e.g. ``python3``, use::
+
+ PYTHON=python3 make test
+
+
Contributing
============
diff --git a/custom_fixers/__init__.py b/custom_fixers/__init__.py
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/custom_fixers/__init__.py
diff --git a/custom_fixers/fix_alt_unicode.py b/custom_fixers/fix_alt_unicode.py
new file mode 100644
index 00000000..55175e90
--- /dev/null
+++ b/custom_fixers/fix_alt_unicode.py
@@ -0,0 +1,12 @@
+from lib2to3.fixer_base import BaseFix
+from lib2to3.fixer_util import Name
+
+class FixAltUnicode(BaseFix):
+ PATTERN = """
+ func=funcdef< 'def' name='__unicode__'
+ parameters< '(' NAME ')' > any+ >
+ """
+
+ def transform(self, node, results):
+ name = results['name']
+ name.replace(Name('__str__', prefix=name.prefix))
diff --git a/distribute_setup.py b/distribute_setup.py
new file mode 100644
index 00000000..37117b34
--- /dev/null
+++ b/distribute_setup.py
@@ -0,0 +1,485 @@
+#!python
+"""Bootstrap distribute installation
+
+If you want to use setuptools in your package's setup.py, just include this
+file in the same directory with it, and add this to the top of your setup.py::
+
+ from distribute_setup import use_setuptools
+ use_setuptools()
+
+If you want to require a specific version of setuptools, set a download
+mirror, or use an alternate download directory, you can do so by supplying
+the appropriate options to ``use_setuptools()``.
+
+This file can also be run as a script to install or upgrade setuptools.
+"""
+import os
+import sys
+import time
+import fnmatch
+import tempfile
+import tarfile
+from distutils import log
+
+try:
+ from site import USER_SITE
+except ImportError:
+ USER_SITE = None
+
+try:
+ import subprocess
+
+ def _python_cmd(*args):
+ args = (sys.executable,) + args
+ return subprocess.call(args) == 0
+
+except ImportError:
+ # will be used for python 2.3
+ def _python_cmd(*args):
+ args = (sys.executable,) + args
+ # quoting arguments if windows
+ if sys.platform == 'win32':
+ def quote(arg):
+ if ' ' in arg:
+ return '"%s"' % arg
+ return arg
+ args = [quote(arg) for arg in args]
+ return os.spawnl(os.P_WAIT, sys.executable, *args) == 0
+
+DEFAULT_VERSION = "0.6.13"
+DEFAULT_URL = "http://pypi.python.org/packages/source/d/distribute/"
+SETUPTOOLS_FAKED_VERSION = "0.6c11"
+
+SETUPTOOLS_PKG_INFO = """\
+Metadata-Version: 1.0
+Name: setuptools
+Version: %s
+Summary: xxxx
+Home-page: xxx
+Author: xxx
+Author-email: xxx
+License: xxx
+Description: xxx
+""" % SETUPTOOLS_FAKED_VERSION
+
+
+def _install(tarball):
+ # extracting the tarball
+ tmpdir = tempfile.mkdtemp()
+ log.warn('Extracting in %s', tmpdir)
+ old_wd = os.getcwd()
+ try:
+ os.chdir(tmpdir)
+ tar = tarfile.open(tarball)
+ _extractall(tar)
+ tar.close()
+
+ # going in the directory
+ subdir = os.path.join(tmpdir, os.listdir(tmpdir)[0])
+ os.chdir(subdir)
+ log.warn('Now working in %s', subdir)
+
+ # installing
+ log.warn('Installing Distribute')
+ if not _python_cmd('setup.py', 'install'):
+ log.warn('Something went wrong during the installation.')
+ log.warn('See the error message above.')
+ finally:
+ os.chdir(old_wd)
+
+
+def _build_egg(egg, tarball, to_dir):
+ # extracting the tarball
+ tmpdir = tempfile.mkdtemp()
+ log.warn('Extracting in %s', tmpdir)
+ old_wd = os.getcwd()
+ try:
+ os.chdir(tmpdir)
+ tar = tarfile.open(tarball)
+ _extractall(tar)
+ tar.close()
+
+ # going in the directory
+ subdir = os.path.join(tmpdir, os.listdir(tmpdir)[0])
+ os.chdir(subdir)
+ log.warn('Now working in %s', subdir)
+
+ # building an egg
+ log.warn('Building a Distribute egg in %s', to_dir)
+ _python_cmd('setup.py', '-q', 'bdist_egg', '--dist-dir', to_dir)
+
+ finally:
+ os.chdir(old_wd)
+ # returning the result
+ log.warn(egg)
+ if not os.path.exists(egg):
+ raise IOError('Could not build the egg.')
+
+
+def _do_download(version, download_base, to_dir, download_delay):
+ egg = os.path.join(to_dir, 'distribute-%s-py%d.%d.egg'
+ % (version, sys.version_info[0], sys.version_info[1]))
+ if not os.path.exists(egg):
+ tarball = download_setuptools(version, download_base,
+ to_dir, download_delay)
+ _build_egg(egg, tarball, to_dir)
+ sys.path.insert(0, egg)
+ import setuptools
+ setuptools.bootstrap_install_from = egg
+
+
+def use_setuptools(version=DEFAULT_VERSION, download_base=DEFAULT_URL,
+ to_dir=os.curdir, download_delay=15, no_fake=True):
+ # making sure we use the absolute path
+ to_dir = os.path.abspath(to_dir)
+ was_imported = 'pkg_resources' in sys.modules or \
+ 'setuptools' in sys.modules
+ try:
+ try:
+ import pkg_resources
+ if not hasattr(pkg_resources, '_distribute'):
+ if not no_fake:
+ _fake_setuptools()
+ raise ImportError
+ except ImportError:
+ return _do_download(version, download_base, to_dir, download_delay)
+ try:
+ pkg_resources.require("distribute>="+version)
+ return
+ except pkg_resources.VersionConflict:
+ e = sys.exc_info()[1]
+ if was_imported:
+ sys.stderr.write(
+ "The required version of distribute (>=%s) is not available,\n"
+ "and can't be installed while this script is running. Please\n"
+ "install a more recent version first, using\n"
+ "'easy_install -U distribute'."
+ "\n\n(Currently using %r)\n" % (version, e.args[0]))
+ sys.exit(2)
+ else:
+ del pkg_resources, sys.modules['pkg_resources'] # reload ok
+ return _do_download(version, download_base, to_dir,
+ download_delay)
+ except pkg_resources.DistributionNotFound:
+ return _do_download(version, download_base, to_dir,
+ download_delay)
+ finally:
+ if not no_fake:
+ _create_fake_setuptools_pkg_info(to_dir)
+
+def download_setuptools(version=DEFAULT_VERSION, download_base=DEFAULT_URL,
+ to_dir=os.curdir, delay=15):
+ """Download distribute from a specified location and return its filename
+
+ `version` should be a valid distribute version number that is available
+ as an egg for download under the `download_base` URL (which should end
+ with a '/'). `to_dir` is the directory where the egg will be downloaded.
+ `delay` is the number of seconds to pause before an actual download
+ attempt.
+ """
+ # making sure we use the absolute path
+ to_dir = os.path.abspath(to_dir)
+ try:
+ from urllib.request import urlopen
+ except ImportError:
+ from urllib2 import urlopen
+ tgz_name = "distribute-%s.tar.gz" % version
+ url = download_base + tgz_name
+ saveto = os.path.join(to_dir, tgz_name)
+ src = dst = None
+ if not os.path.exists(saveto): # Avoid repeated downloads
+ try:
+ log.warn("Downloading %s", url)
+ src = urlopen(url)
+ # Read/write all in one block, so we don't create a corrupt file
+ # if the download is interrupted.
+ data = src.read()
+ dst = open(saveto, "wb")
+ dst.write(data)
+ finally:
+ if src:
+ src.close()
+ if dst:
+ dst.close()
+ return os.path.realpath(saveto)
+
+def _no_sandbox(function):
+ def __no_sandbox(*args, **kw):
+ try:
+ from setuptools.sandbox import DirectorySandbox
+ if not hasattr(DirectorySandbox, '_old'):
+ def violation(*args):
+ pass
+ DirectorySandbox._old = DirectorySandbox._violation
+ DirectorySandbox._violation = violation
+ patched = True
+ else:
+ patched = False
+ except ImportError:
+ patched = False
+
+ try:
+ return function(*args, **kw)
+ finally:
+ if patched:
+ DirectorySandbox._violation = DirectorySandbox._old
+ del DirectorySandbox._old
+
+ return __no_sandbox
+
+def _patch_file(path, content):
+ """Will backup the file then patch it"""
+ existing_content = open(path).read()
+ if existing_content == content:
+ # already patched
+ log.warn('Already patched.')
+ return False
+ log.warn('Patching...')
+ _rename_path(path)
+ f = open(path, 'w')
+ try:
+ f.write(content)
+ finally:
+ f.close()
+ return True
+
+_patch_file = _no_sandbox(_patch_file)
+
+def _same_content(path, content):
+ return open(path).read() == content
+
+def _rename_path(path):
+ new_name = path + '.OLD.%s' % time.time()
+ log.warn('Renaming %s into %s', path, new_name)
+ os.rename(path, new_name)
+ return new_name
+
+def _remove_flat_installation(placeholder):
+ if not os.path.isdir(placeholder):
+ log.warn('Unkown installation at %s', placeholder)
+ return False
+ found = False
+ for file in os.listdir(placeholder):
+ if fnmatch.fnmatch(file, 'setuptools*.egg-info'):
+ found = True
+ break
+ if not found:
+ log.warn('Could not locate setuptools*.egg-info')
+ return
+
+ log.warn('Removing elements out of the way...')
+ pkg_info = os.path.join(placeholder, file)
+ if os.path.isdir(pkg_info):
+ patched = _patch_egg_dir(pkg_info)
+ else:
+ patched = _patch_file(pkg_info, SETUPTOOLS_PKG_INFO)
+
+ if not patched:
+ log.warn('%s already patched.', pkg_info)
+ return False
+ # now let's move the files out of the way
+ for element in ('setuptools', 'pkg_resources.py', 'site.py'):
+ element = os.path.join(placeholder, element)
+ if os.path.exists(element):
+ _rename_path(element)
+ else:
+ log.warn('Could not find the %s element of the '
+ 'Setuptools distribution', element)
+ return True
+
+_remove_flat_installation = _no_sandbox(_remove_flat_installation)
+
+def _after_install(dist):
+ log.warn('After install bootstrap.')
+ placeholder = dist.get_command_obj('install').install_purelib
+ _create_fake_setuptools_pkg_info(placeholder)
+
+def _create_fake_setuptools_pkg_info(placeholder):
+ if not placeholder or not os.path.exists(placeholder):
+ log.warn('Could not find the install location')
+ return
+ pyver = '%s.%s' % (sys.version_info[0], sys.version_info[1])
+ setuptools_file = 'setuptools-%s-py%s.egg-info' % \
+ (SETUPTOOLS_FAKED_VERSION, pyver)
+ pkg_info = os.path.join(placeholder, setuptools_file)
+ if os.path.exists(pkg_info):
+ log.warn('%s already exists', pkg_info)
+ return
+
+ log.warn('Creating %s', pkg_info)
+ f = open(pkg_info, 'w')
+ try:
+ f.write(SETUPTOOLS_PKG_INFO)
+ finally:
+ f.close()
+
+ pth_file = os.path.join(placeholder, 'setuptools.pth')
+ log.warn('Creating %s', pth_file)
+ f = open(pth_file, 'w')
+ try:
+ f.write(os.path.join(os.curdir, setuptools_file))
+ finally:
+ f.close()
+
+_create_fake_setuptools_pkg_info = _no_sandbox(_create_fake_setuptools_pkg_info)
+
+def _patch_egg_dir(path):
+ # let's check if it's already patched
+ pkg_info = os.path.join(path, 'EGG-INFO', 'PKG-INFO')
+ if os.path.exists(pkg_info):
+ if _same_content(pkg_info, SETUPTOOLS_PKG_INFO):
+ log.warn('%s already patched.', pkg_info)
+ return False
+ _rename_path(path)
+ os.mkdir(path)
+ os.mkdir(os.path.join(path, 'EGG-INFO'))
+ pkg_info = os.path.join(path, 'EGG-INFO', 'PKG-INFO')
+ f = open(pkg_info, 'w')
+ try:
+ f.write(SETUPTOOLS_PKG_INFO)
+ finally:
+ f.close()
+ return True
+
+_patch_egg_dir = _no_sandbox(_patch_egg_dir)
+
+def _before_install():
+ log.warn('Before install bootstrap.')
+ _fake_setuptools()
+
+
+def _under_prefix(location):
+ if 'install' not in sys.argv:
+ return True
+ args = sys.argv[sys.argv.index('install')+1:]
+ for index, arg in enumerate(args):
+ for option in ('--root', '--prefix'):
+ if arg.startswith('%s=' % option):
+ top_dir = arg.split('root=')[-1]
+ return location.startswith(top_dir)
+ elif arg == option:
+ if len(args) > index:
+ top_dir = args[index+1]
+ return location.startswith(top_dir)
+ if arg == '--user' and USER_SITE is not None:
+ return location.startswith(USER_SITE)
+ return True
+
+
+def _fake_setuptools():
+ log.warn('Scanning installed packages')
+ try:
+ import pkg_resources
+ except ImportError:
+ # we're cool
+ log.warn('Setuptools or Distribute does not seem to be installed.')
+ return
+ ws = pkg_resources.working_set
+ try:
+ setuptools_dist = ws.find(pkg_resources.Requirement.parse('setuptools',
+ replacement=False))
+ except TypeError:
+ # old distribute API
+ setuptools_dist = ws.find(pkg_resources.Requirement.parse('setuptools'))
+
+ if setuptools_dist is None:
+ log.warn('No setuptools distribution found')
+ return
+ # detecting if it was already faked
+ setuptools_location = setuptools_dist.location
+ log.warn('Setuptools installation detected at %s', setuptools_location)
+
+ # if --root or --preix was provided, and if
+ # setuptools is not located in them, we don't patch it
+ if not _under_prefix(setuptools_location):
+ log.warn('Not patching, --root or --prefix is installing Distribute'
+ ' in another location')
+ return
+
+ # let's see if its an egg
+ if not setuptools_location.endswith('.egg'):
+ log.warn('Non-egg installation')
+ res = _remove_flat_installation(setuptools_location)
+ if not res:
+ return
+ else:
+ log.warn('Egg installation')
+ pkg_info = os.path.join(setuptools_location, 'EGG-INFO', 'PKG-INFO')
+ if (os.path.exists(pkg_info) and
+ _same_content(pkg_info, SETUPTOOLS_PKG_INFO)):
+ log.warn('Already patched.')
+ return
+ log.warn('Patching...')
+ # let's create a fake egg replacing setuptools one
+ res = _patch_egg_dir(setuptools_location)
+ if not res:
+ return
+ log.warn('Patched done.')
+ _relaunch()
+
+
+def _relaunch():
+ log.warn('Relaunching...')
+ # we have to relaunch the process
+ # pip marker to avoid a relaunch bug
+ if sys.argv[:3] == ['-c', 'install', '--single-version-externally-managed']:
+ sys.argv[0] = 'setup.py'
+ args = [sys.executable] + sys.argv
+ sys.exit(subprocess.call(args))
+
+
+def _extractall(self, path=".", members=None):
+ """Extract all members from the archive to the current working
+ directory and set owner, modification time and permissions on
+ directories afterwards. `path' specifies a different directory
+ to extract to. `members' is optional and must be a subset of the
+ list returned by getmembers().
+ """
+ import copy
+ import operator
+ from tarfile import ExtractError
+ directories = []
+
+ if members is None:
+ members = self
+
+ for tarinfo in members:
+ if tarinfo.isdir():
+ # Extract directories with a safe mode.
+ directories.append(tarinfo)
+ tarinfo = copy.copy(tarinfo)
+ tarinfo.mode = 448 # decimal for oct 0700
+ self.extract(tarinfo, path)
+
+ # Reverse sort directories.
+ if sys.version_info < (2, 4):
+ def sorter(dir1, dir2):
+ return cmp(dir1.name, dir2.name)
+ directories.sort(sorter)
+ directories.reverse()
+ else:
+ directories.sort(key=operator.attrgetter('name'), reverse=True)
+
+ # Set correct owner, mtime and filemode on directories.
+ for tarinfo in directories:
+ dirpath = os.path.join(path, tarinfo.name)
+ try:
+ self.chown(tarinfo, dirpath)
+ self.utime(tarinfo, dirpath)
+ self.chmod(tarinfo, dirpath)
+ except ExtractError:
+ e = sys.exc_info()[1]
+ if self.errorlevel > 1:
+ raise
+ else:
+ self._dbg(1, "tarfile: %s" % e)
+
+
+def main(argv, version=DEFAULT_VERSION):
+ """Install or upgrade setuptools and EasyInstall"""
+ tarball = download_setuptools()
+ _install(tarball)
+
+
+if __name__ == '__main__':
+ main(sys.argv[1:])
diff --git a/doc/Makefile b/doc/Makefile
index 90fb5af2..47951316 100644
--- a/doc/Makefile
+++ b/doc/Makefile
@@ -8,8 +8,9 @@ PAPER =
PAPEROPT_a4 = -D latex_paper_size=a4
PAPEROPT_letter = -D latex_paper_size=letter
-ALLSPHINXOPTS = -d _build/doctrees $(PAPEROPT_$(PAPER)) \
- $(SPHINXOPTS) $(O) .
+ALLSPHINXOPTS = -d _build/doctrees $(PAPEROPT_$(PAPER)) \
+ $(SPHINXOPTS) $(O) .
+I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) $(O) .
.PHONY: help clean html dirhtml singlehtml text man pickle json htmlhelp \
qthelp devhelp epub latex latexpdf changes linkcheck doctest
@@ -29,6 +30,9 @@ help:
@echo " epub to make an epub file"
@echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
@echo " latexpdf to make LaTeX files and run pdflatex"
+ @echo " texinfo to make Texinfo files"
+ @echo " info to make Texinfo files and run them through makeinfo"
+ @echo " gettext to make PO message catalogs"
@echo " changes to make an overview over all changed/added/deprecated items"
@echo " linkcheck to check all external links for integrity"
@@ -112,6 +116,11 @@ latexpdf:
make -C _build/latex all-pdf
@echo "pdflatex finished; the PDF files are in _build/latex."
+gettext:
+ $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) _build/locale
+ @echo
+ @echo "Build finished. The message catalogs are in _build/locale."
+
changes:
$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) _build/changes
@echo
@@ -125,3 +134,16 @@ linkcheck:
doctest:
$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) _build/doctest
+
+texinfo:
+ $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) _build/texinfo
+ @echo
+ @echo "Build finished. The Texinfo files are in _build/texinfo."
+ @echo "Run \`make' in that directory to run these through makeinfo" \
+ "(use \`make info' here to do that automatically)."
+
+info:
+ $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) _build/texinfo
+ @echo "Running Texinfo files through makeinfo..."
+ make -C _build/texinfo info
+ @echo "makeinfo finished; the Info files are in _build/texinfo."
diff --git a/doc/builders.rst b/doc/builders.rst
index 80203e75..71600137 100644
--- a/doc/builders.rst
+++ b/doc/builders.rst
@@ -144,6 +144,26 @@ Note that a direct PDF builder using ReportLab is available in `rst2pdf
.. versionadded:: 1.0
+
+.. module:: sphinx.builders.texinfo
+.. class:: TexinfoBuilder
+
+ This builder produces Texinfo files that can be processed into Info files by
+ the :program:`makeinfo` program. You have to specify which documents are to
+ be included in which Texinfo files via the :confval:`texinfo_documents`
+ configuration value.
+
+ The Info format is the basis of the on-line help system used by GNU Emacs and
+ the terminal-based program :program:`info`. See :ref:`texinfo-faq` for more
+ details. The Texinfo format is the official documentation system used by the
+ GNU project. More information on Texinfo can be found at
+ `<http://www.gnu.org/software/texinfo/>`_.
+
+ Its name is ``texinfo``.
+
+ .. versionadded:: 1.1
+
+
.. currentmodule:: sphinx.builders.html
.. class:: SerializingHTMLBuilder
@@ -220,6 +240,18 @@ Note that a direct PDF builder using ReportLab is available in `rst2pdf
.. versionadded:: 0.5
+.. module:: sphinx.builders.gettext
+.. class:: MessageCatalogBuilder
+
+ This builder produces gettext-style message catalogs. Each top-level file or
+ subdirectory grows a single ``.pot`` catalog template.
+
+ See the documentation on :ref:`intl` for further reference.
+
+ Its name is ``gettext``.
+
+ .. versionadded:: 1.1
+
.. module:: sphinx.builders.changes
.. class:: ChangesBuilder
diff --git a/doc/conf.py b/doc/conf.py
index ee94ed9e..1b8ba3e4 100644
--- a/doc/conf.py
+++ b/doc/conf.py
@@ -44,6 +44,7 @@ latex_logo = '_static/sphinx.png'
latex_elements = {
'fontpkg': '\\usepackage{palatino}',
}
+latex_show_urls = 'footnote'
autodoc_member_order = 'groupwise'
todo_include_todos = True
@@ -61,6 +62,14 @@ man_pages = [
'', 1),
('man/sphinx-quickstart', 'sphinx-quickstart', 'Sphinx documentation '
'template generator', '', 1),
+ ('man/sphinx-apidoc', 'sphinx-apidoc', 'Sphinx API doc generator tool',
+ '', 1),
+]
+
+texinfo_documents = [
+ ('contents', 'sphinx', 'Sphinx Documentation', 'Georg Brandl',
+ 'Sphinx', 'The Sphinx documentation builder.', 'Documentation tools',
+ 1),
]
# We're not using intersphinx right now, but if we did, this would be part of
diff --git a/doc/config.rst b/doc/config.rst
index 59705892..5d188c61 100644
--- a/doc/config.rst
+++ b/doc/config.rst
@@ -143,20 +143,6 @@ General configuration
.. deprecated:: 1.0
Use :confval:`exclude_patterns` instead.
-.. confval:: locale_dirs
-
- .. versionadded:: 0.5
-
- Directories in which to search for additional Sphinx message catalogs (see
- :confval:`language`), relative to the source directory. The directories on
- this path are searched by the standard :mod:`gettext` module for a text
- domain of ``sphinx``; so if you add the directory :file:`./locale` to this
- settting, the message catalogs (compiled from ``.po`` format using
- :program:`msgfmt`) must be in
- :file:`./locale/{language}/LC_MESSAGES/sphinx.mo`.
-
- The default is ``[]``.
-
.. confval:: templates_path
A list of paths that contain extra templates (or templates that overwrite
@@ -246,6 +232,14 @@ General configuration
.. versionadded:: 1.0
+.. confval:: nitpick_ignore
+
+ A list of ``(type, target)`` tuples (by default empty) that should be ignored
+ when generating warnings in "nitpicky mode". Note that ``type`` should
+ include the domain name. An example entry would be ``('py:func', 'int')``.
+
+ .. versionadded:: 1.1
+
Project information
-------------------
@@ -272,40 +266,6 @@ Project information
If you don't need the separation provided between :confval:`version` and
:confval:`release`, just set them both to the same value.
-.. confval:: language
-
- The code for the language the docs are written in. Any text automatically
- generated by Sphinx will be in that language. Also, in the LaTeX builder, a
- suitable language will be selected as an option for the *Babel* package.
- Default is ``None``, which means that no translation will be done.
-
- .. versionadded:: 0.5
-
- Currently supported languages are:
-
- * ``bn`` -- Bengali
- * ``ca`` -- Catalan
- * ``cs`` -- Czech
- * ``da`` -- Danish
- * ``de`` -- German
- * ``en`` -- English
- * ``es`` -- Spanish
- * ``fi`` -- Finnish
- * ``fr`` -- French
- * ``hr`` -- Croatian
- * ``it`` -- Italian
- * ``ja`` -- Japanese
- * ``lt`` -- Lithuanian
- * ``nl`` -- Dutch
- * ``pl`` -- Polish
- * ``pt_BR`` -- Brazilian Portuguese
- * ``ru`` -- Russian
- * ``sl`` -- Slovenian
- * ``tr`` -- Turkish
- * ``uk_UA`` -- Ukrainian
- * ``zh_CN`` -- Simplified Chinese
- * ``zh_TW`` -- Traditional Chinese
-
.. confval:: today
today_fmt
@@ -374,11 +334,91 @@ Project information
.. confval:: trim_doctest_flags
If true, doctest flags (comments looking like ``# doctest: FLAG, ...``) at
- the ends of lines are removed for all code blocks showing interactive Python
- sessions (i.e. doctests). Default is true. See the extension
- :mod:`~sphinx.ext.doctest` for more possibilities of including doctests.
+ the ends of lines and ``<BLANKLINE>`` markers are removed for all code
+ blocks showing interactive Python sessions (i.e. doctests). Default is
+ true. See the extension :mod:`~sphinx.ext.doctest` for more possibilities
+ of including doctests.
.. versionadded:: 1.0
+ .. versionchanged:: 1.1
+ Now also removes ``<BLANKLINE>``.
+
+
+.. _intl-options:
+
+Options for internationalization
+--------------------------------
+
+These options influence Sphinx' *Native Language Support*. See the
+documentation on :ref:`intl` for details.
+
+.. confval:: language
+
+ The code for the language the docs are written in. Any text automatically
+ generated by Sphinx will be in that language. Also, Sphinx will try to
+ substitute individual paragraphs from your documents with the translation
+ sets obtained from :confval:`locale_dirs`. In the LaTeX builder, a suitable
+ language will be selected as an option for the *Babel* package. Default is
+ ``None``, which means that no translation will be done.
+
+ .. versionadded:: 0.5
+
+ Currently supported languages by Sphinx are:
+
+ * ``bn`` -- Bengali
+ * ``ca`` -- Catalan
+ * ``cs`` -- Czech
+ * ``da`` -- Danish
+ * ``de`` -- German
+ * ``en`` -- English
+ * ``es`` -- Spanish
+ * ``et`` -- Estonian
+ * ``fa`` -- Iranian
+ * ``fi`` -- Finnish
+ * ``fr`` -- French
+ * ``hr`` -- Croatian
+ * ``it`` -- Italian
+ * ``ja`` -- Japanese
+ * ``ko`` -- Korean
+ * ``lt`` -- Lithuanian
+ * ``lv`` -- Latvian
+ * ``ne`` -- Nepali
+ * ``nl`` -- Dutch
+ * ``pl`` -- Polish
+ * ``pt_BR`` -- Brazilian Portuguese
+ * ``ru`` -- Russian
+ * ``sl`` -- Slovenian
+ * ``sv`` -- Swedish
+ * ``tr`` -- Turkish
+ * ``uk_UA`` -- Ukrainian
+ * ``zh_CN`` -- Simplified Chinese
+ * ``zh_TW`` -- Traditional Chinese
+
+.. confval:: locale_dirs
+
+ .. versionadded:: 0.5
+
+ Directories in which to search for additional message catalogs (see
+ :confval:`language`), relative to the source directory. The directories on
+ this path are searched by the standard :mod:`gettext` module.
+
+ Internal messages are fetched from a text domain of ``sphinx``; so if you
+ add the directory :file:`./locale` to this settting, the message catalogs
+ (compiled from ``.po`` format using :program:`msgfmt`) must be in
+ :file:`./locale/{language}/LC_MESSAGES/sphinx.mo`. The text domain of
+ individual documents depends on :confval:`gettext_compact`.
+
+ The default is ``[]``.
+
+.. confval:: gettext_compact
+
+ .. versionadded:: 1.1
+
+ If true, a document's text domain is its docname if it is a top-level
+ project file and its very base directory otherwise.
+
+ By default, the document ``markup/code.rst`` ends up in the ``markup`` text
+ domain. With this option set to ``False``, it is ``markup/code``.
.. _html-options:
@@ -490,13 +530,19 @@ that use Sphinx' HTMLWriter class.
.. confval:: html_add_permalinks
- If true, Sphinx will add "permalinks" for each heading and description
- environment as paragraph signs that become visible when the mouse hovers over
- them. Default: ``True``.
+ Sphinx will add "permalinks" for each heading and description environment as
+ paragraph signs that become visible when the mouse hovers over them.
+
+ This value determines the text for the permalink; it defaults to ``"¶"``.
+ Set it to ``None`` or the empty string to disable permalinks.
.. versionadded:: 0.6
Previously, this was always activated.
+ .. versionchanged:: 1.1
+ This can now be a string to select the actual text of the link.
+ Previously, only boolean values were accepted.
+
.. confval:: html_sidebars
Custom sidebar templates, must be a dictionary that maps document names to
@@ -679,6 +725,38 @@ that use Sphinx' HTMLWriter class.
.. versionadded:: 1.0
+.. confval:: html_search_language
+
+ Language to be used for generating the HTML full-text search index. This
+ defaults to the global language selected with :confval:`language`. If there
+ is no support for this language, ``"en"`` is used which selects the English
+ language.
+
+ Support is present for these languages:
+
+ * ``en`` -- English
+ * ``ja`` -- Japanese
+
+ .. versionadded:: 1.1
+
+.. confval:: html_search_options
+
+ A dictionary with options for the search language support, empty by default.
+ The meaning of these options depends on the language selected.
+
+ The English support has no options.
+
+ The Japanese support has these options:
+
+ * ``type`` -- ``'mecab'`` or ``'default'`` (selects either MeCab or
+ TinySegmenter word splitter algorithm)
+ * ``dic_enc`` -- the encoding for the MeCab algorithm
+ * ``dict`` -- the dictionary to use for the MeCab algorithm
+ * ``lib`` -- the library name for finding the MeCab library via ctypes if the
+ Python binding is not installed
+
+ .. versionadded:: 1.1
+
.. confval:: htmlhelp_basename
Output file base name for HTML help builder. Default is ``'pydoc'``.
@@ -750,6 +828,22 @@ the `Dublin Core metadata <http://dublincore.org/>`_.
A unique identifier for the document. This is put in the Dublin Core
metadata. You may use a random string. The default value is ``'unknown'``.
+.. confval:: epub_cover
+
+ The cover page information. This is a tuple containing the filenames of
+ the cover image and the html template. The rendered html cover page is
+ inserted as the first item in the spine in :file:`content.opf`. If the
+ template filename is empty, no html cover page is created. No cover at all
+ is created if the tuple is empty. Examples::
+
+ epub_cover = ('_static/cover.png', 'epub-cover.html')
+ epub_cover = ('_static/cover.png', '')
+ epub_cover = ()
+
+ The default value is ``()``.
+
+ .. versionadded:: 1.1
+
.. confval:: epub_pre_files
Additional files that should be inserted before the text generated by
@@ -787,6 +881,7 @@ the `Dublin Core metadata <http://dublincore.org/>`_.
a chapter, but can be confusing because it mixes entries of differnet
depth in one list. The default value is ``True``.
+
.. _latex-options:
Options for LaTeX output
@@ -869,10 +964,18 @@ These options influence LaTeX output.
.. confval:: latex_show_urls
- If true, add URL addresses after links. This is very useful for printed
- copies of the manual. Default is ``False``.
+ Control whether to display URL addresses. This is very useful for printed
+ copies of the manual. The setting can have the following values:
+
+ * ``'no'`` -- do not display URLs (default)
+ * ``'footnote'`` -- display URLs in footnotes
+ * ``'inline'`` -- display URLs inline in parentheses
.. versionadded:: 1.0
+ .. versionchanged:: 1.1
+ This value is now a string; previously it was a boolean value, and a true
+ value selected the ``'inline'`` display. For backwards compatibility,
+ ``True`` is still accepted.
.. confval:: latex_elements
@@ -985,6 +1088,37 @@ These options influence LaTeX output.
Use the ``'pointsize'`` key in the :confval:`latex_elements` value.
+.. _text-options:
+
+Options for text output
+-----------------------
+
+These options influence text output.
+
+.. confval:: text_newlines
+
+ Determines which end-of-line character(s) are used in text output.
+
+ * ``'unix'``: use Unix-style line endings (``\n``)
+ * ``'windows'``: use Windows-style line endings (``\r\n``)
+ * ``'native'``: use the line ending style of the platform the documentation
+ is built on
+
+ Default: ``'unix'``.
+
+ .. versionadded:: 1.1
+
+.. confval:: text_sectionchars
+
+ A string of 7 characters that should be used for underlining sections.
+ The first character is used for first-level headings, the second for
+ second-level headings and so on.
+
+ The default is ``'*=-~"+`'``.
+
+ .. versionadded:: 1.1
+
+
.. _man-options:
Options for manual page output
@@ -1007,14 +1141,152 @@ These options influence manual page output.
well as the name of the manual page (in the NAME section).
* *description*: description of the manual page. This is used in the NAME
section.
- * *authors*: A list of strings with authors, or a single string. Can be
- an empty string or list if you do not want to automatically generate
- an AUTHORS section in the manual page.
+ * *authors*: A list of strings with authors, or a single string. Can be an
+ empty string or list if you do not want to automatically generate an
+ AUTHORS section in the manual page.
* *section*: The manual page section. Used for the output file name as well
as in the manual page header.
.. versionadded:: 1.0
+.. confval:: man_show_urls
+
+ If true, add URL addresses after links. Default is ``False``.
+
+ .. versionadded:: 1.1
+
+
+.. _texinfo-options:
+
+Options for Texinfo output
+--------------------------
+
+These options influence Texinfo output.
+
+.. confval:: texinfo_documents
+
+ This value determines how to group the document tree into Texinfo source
+ files. It must be a list of tuples ``(startdocname, targetname, title,
+ author, dir_entry, description, category, toctree_only)``, where the items
+ are:
+
+ * *startdocname*: document name that is the "root" of the Texinfo file. All
+ documents referenced by it in TOC trees will be included in the Texinfo
+ file too. (If you want only one Texinfo file, use your
+ :confval:`master_doc` here.)
+ * *targetname*: file name (no extension) of the Texinfo file in the output
+ directory.
+ * *title*: Texinfo document title. Can be empty to use the title of the
+ *startdoc*. Inserted as Texinfo markup, so special characters like @ and
+ {} will need to be escaped to be inserted literally.
+ * *author*: Author for the Texinfo document. Inserted as Texinfo markup.
+ Use ``@*`` to separate multiple authors, as in: ``'John@*Sarah'``.
+ * *dir_entry*: The name that will appear in the top-level ``DIR`` menu file.
+ * *description*: Descriptive text to appear in the top-level ``DIR`` menu
+ file.
+ * *category*: Specifies the section which this entry will appear in the
+ top-level ``DIR`` menu file.
+ * *toctree_only*: Must be ``True`` or ``False``. If ``True``, the *startdoc*
+ document itself is not included in the output, only the documents
+ referenced by it via TOC trees. With this option, you can put extra stuff
+ in the master document that shows up in the HTML, but not the Texinfo
+ output.
+
+ .. versionadded:: 1.1
+
+.. confval:: texinfo_appendices
+
+ A list of document names to append as an appendix to all manuals.
+
+ .. versionadded:: 1.1
+
+.. confval:: texinfo_domain_indices
+
+ If true, generate domain-specific indices in addition to the general index.
+ For e.g. the Python domain, this is the global module index. Default is
+ ``True``.
+
+ This value can be a bool or a list of index names that should be generated,
+ like for :confval:`html_domain_indices`.
+
+ .. versionadded:: 1.1
+
+.. confval:: texinfo_show_urls
+
+ Control how to display URL addresses.
+
+ * ``'footnote'`` -- display URLs in footnotes (default)
+ * ``'no'`` -- do not display URLs
+ * ``'inline'`` -- display URLs inline in parentheses
+
+ .. versionadded:: 1.1
+
+.. confval:: texinfo_elements
+
+ A dictionary that contains Texinfo snippets that override those Sphinx
+ usually puts into the generated ``.texi`` files.
+
+ * Keys that you may want to override include:
+
+ ``'paragraphindent'``
+ Number of spaces to indent the first line of each paragraph, default
+ ``2``. Specify ``0`` for no indentation.
+
+ ``'exampleindent'``
+ Number of spaces to indent the lines for examples or literal blocks,
+ default ``4``. Specify ``0`` for no indentation.
+
+ ``'preamble'``
+ Texinfo markup inserted near the beginning of the file.
+
+ ``'copying'``
+ Texinfo markup inserted within the ``@copying`` block and displayed
+ after the title. The default value consists of a simple title page
+ identifying the project.
+
+ * Keys that are set by other options and therefore should not be overridden
+ are:
+
+ ``'author'``
+ ``'body'``
+ ``'date'``
+ ``'direntry'``
+ ``'filename'``
+ ``'project'``
+ ``'release'``
+ ``'title'``
+ ``'direntry'``
+
+ .. versionadded:: 1.1
+
+
+Options for the linkcheck builder
+---------------------------------
+
+.. confval:: linkcheck_ignore
+
+ A list of regular expressions that match URIs that should not be checked
+ when doing a ``linkcheck`` build. Example::
+
+ linkcheck_ignore = [r'http://localhost:\d+/']
+
+ .. versionadded:: 1.1
+
+.. confval:: linkcheck_timeout
+
+ A timeout value, in seconds, for the linkcheck builder. **Only works in
+ Python 2.6 and higher.** The default is to use Python's global socket
+ timeout.
+
+ .. versionadded:: 1.1
+
+.. confval:: linkcheck_workers
+
+ The number of worker threads to use when checking links. Default is 5
+ threads.
+
+ .. versionadded:: 1.1
+
.. rubric:: Footnotes
diff --git a/doc/contents.rst b/doc/contents.rst
index 079f93f2..3bbc2835 100644
--- a/doc/contents.rst
+++ b/doc/contents.rst
@@ -14,9 +14,11 @@ Sphinx documentation contents
domains
builders
config
+ intl
theming
templating
extensions
+ websupport
faq
glossary
diff --git a/doc/domains.rst b/doc/domains.rst
index 56442599..9894caab 100644
--- a/doc/domains.rst
+++ b/doc/domains.rst
@@ -231,6 +231,45 @@ The following directives are provided for module and class contents:
.. versionadded:: 0.6
+.. rst:directive:: .. py:decorator:: name
+ .. py:decorator:: name(signature)
+
+ Describes a decorator function. The signature should *not* represent the
+ signature of the actual function, but the usage as a decorator. For example,
+ given the functions
+
+ .. code-block:: python
+
+ def removename(func):
+ func.__name__ = ''
+ return func
+
+ def setnewname(name):
+ def decorator(func):
+ func.__name__ = name
+ return func
+ return decorator
+
+ the descriptions should look like this::
+
+ .. py:decorator:: removename
+
+ Remove name of the decorated function.
+
+ .. py:decorator:: setnewname(name)
+
+ Set name of the decorated function to *name*.
+
+ There is no ``py:deco`` role to link to a decorator that is marked up with
+ this directive; rather, use the :rst:role:`py:func` role.
+
+.. rst:directive:: .. py:decoratormethod:: name
+ .. py:decoratormethod:: name(signature)
+
+ Same as :rst:dir:`py:decorator`, but for decorators that are methods.
+
+ Refer to a decorator method using the :rst:role:`py:meth` role.
+
.. _signatures:
@@ -776,4 +815,4 @@ The sphinx-contrib_ repository contains more domains available as extensions;
currently a Ruby and an Erlang domain.
-.. _sphinx-contrib: http://bitbucket.org/birkenfeld/sphinx-contrib/
+.. _sphinx-contrib: https://bitbucket.org/birkenfeld/sphinx-contrib/
diff --git a/doc/ext/appapi.rst b/doc/ext/appapi.rst
index 302013da..643de995 100644
--- a/doc/ext/appapi.rst
+++ b/doc/ext/appapi.rst
@@ -76,9 +76,9 @@ the following public API:
Node visitor functions for the Sphinx HTML, LaTeX, text and manpage writers
can be given as keyword arguments: the keyword must be one or more of
- ``'html'``, ``'latex'``, ``'text'``, ``'man'``, the value a 2-tuple of
- ``(visit, depart)`` methods. ``depart`` can be ``None`` if the ``visit``
- function raises :exc:`docutils.nodes.SkipNode`. Example:
+ ``'html'``, ``'latex'``, ``'text'``, ``'man'``, ``'texinfo'``, the value a
+ 2-tuple of ``(visit, depart)`` methods. ``depart`` can be ``None`` if the
+ ``visit`` function raises :exc:`docutils.nodes.SkipNode`. Example:
.. code-block:: python
@@ -256,7 +256,7 @@ the following public API:
Add *filename* to the list of CSS files that the default HTML template will
include. Like for :meth:`add_javascript`, the filename must be relative to
- the HTML static path.
+ the HTML static path, or a full URI with scheme.
.. versionadded:: 1.0
@@ -287,6 +287,15 @@ the following public API:
.. versionadded:: 0.6
+.. method:: Sphinx.add_search_language(cls)
+
+ Add *cls*, which must be a subclass of :class:`sphinx.search.SearchLanguage`,
+ as a support language for building the HTML full-text search index. The
+ class must have a *lang* attribute that indicates the language it should be
+ used for. See :confval:`html_search_language`.
+
+ .. versionadded:: 1.1
+
.. method:: Sphinx.connect(event, callback)
Register *callback* to be called when *event* is emitted. For details on
@@ -344,6 +353,15 @@ registered event handlers.
Emitted when the builder object has been created. It is available as
``app.builder``.
+.. event:: env-get-outdated (app, env, added, changed, removed)
+
+ Emitted when the environment determines which source files have changed and
+ should be re-read. *added*, *changed* and *removed* are sets of docnames
+ that the environment has determined. You can return a list of docnames to
+ re-read in addition to these.
+
+ .. versionadded:: 1.1
+
.. event:: env-purge-doc (app, env, docname)
Emitted when all traces of a source file should be cleaned from the
diff --git a/doc/ext/autodoc.rst b/doc/ext/autodoc.rst
index 863b1c82..ab520f70 100644
--- a/doc/ext/autodoc.rst
+++ b/doc/ext/autodoc.rst
@@ -93,8 +93,8 @@ inserting them into the page source under a suitable :rst:dir:`py:module`,
.. autoclass:: Noodle
:members: eat, slurp
- * If you want to make the ``members`` option the default, see
- :confval:`autodoc_default_flags`.
+ * If you want to make the ``members`` option (or other flag options described
+ below) the default, see :confval:`autodoc_default_flags`.
* Members without docstrings will be left out, unless you give the
``undoc-members`` flag option::
@@ -103,6 +103,23 @@ inserting them into the page source under a suitable :rst:dir:`py:module`,
:members:
:undoc-members:
+ * "Private" members (that is, those named like ``_private`` or ``__private``)
+ will be included if the ``private-members`` flag option is given.
+
+ .. versionadded:: 1.1
+
+ * Python "special" members (that is, those named like ``__special__``) will
+ be included if the ``special-members`` flag option is given::
+
+ .. autoclass:: my.Class
+ :members:
+ :private-members:
+ :special-members:
+
+ would document both "private" and "special" members of the class.
+
+ .. versionadded:: 1.1
+
* For classes and exceptions, members inherited from base classes will be
left out when documenting all members, unless you give the
``inherited-members`` flag option, in addition to ``members``::
@@ -152,8 +169,8 @@ inserting them into the page source under a suitable :rst:dir:`py:module`,
.. versionadded:: 0.5
- * :rst:dir:`automodule` and :rst:dir:`autoclass` also has an ``member-order`` option
- that can be used to override the global value of
+ * :rst:dir:`automodule` and :rst:dir:`autoclass` also has an ``member-order``
+ option that can be used to override the global value of
:confval:`autodoc_member_order` for one directive.
.. versionadded:: 0.6
@@ -173,29 +190,45 @@ inserting them into the page source under a suitable :rst:dir:`py:module`,
.. rst:directive:: autofunction
- autodata
- automethod
- autoattribute
+ autodata
+ automethod
+ autoattribute
These work exactly like :rst:dir:`autoclass` etc., but do not offer the options
used for automatic member documentation.
For module data members and class attributes, documentation can either be put
- into a special-formatted comment *before* the attribute definition, or in a
- docstring *after* the definition. This means that in the following class
- definition, both attributes can be autodocumented::
+ into a special-formatted comment, or in a docstring *after* the definition.
+ Comments need to be either on a line of their own *before* the definition, or
+ immediately after the assignment *on the same line*. The latter form is
+ restricted to one line only.
+
+ This means that in the following class definition, all attributes can be
+ autodocumented::
class Foo:
"""Docstring for class Foo."""
- #: Doc comment for attribute Foo.bar.
+ #: Doc comment for class attribute Foo.bar.
+ #: It can have multiple lines.
bar = 1
+ flox = 1.5 #: Doc comment for Foo.flox. One line only.
+
baz = 2
- """Docstring for attribute Foo.baz."""
+ """Docstring for class attribute Foo.baz."""
+
+ def __init__(self):
+ #: Doc comment for instance attribute qux.
+ self.qux = 3
+
+ self.spam = 4
+ """Docstring for instance attribute spam."""
.. versionchanged:: 0.6
:rst:dir:`autodata` and :rst:dir:`autoattribute` can now extract docstrings.
+ .. versionchanged:: 1.1
+ Comment docs are now allowed on the same line after an assignment.
.. note::
@@ -246,7 +279,8 @@ There are also new config values that you can set:
This value is a list of autodoc directive flags that should be automatically
applied to all autodoc directives. The supported flags are ``'members'``,
- ``'undoc-members'``, ``'inherited-members'`` and ``'show-inheritance'``.
+ ``'undoc-members'``, ``'private-members'``, ``'special-members'``,
+ ``'inherited-members'`` and ``'show-inheritance'``.
If you set one of these flags in this config value, you can use a negated
form, :samp:`'no-{flag}'`, in an autodoc directive, to disable it once.
@@ -260,6 +294,20 @@ There are also new config values that you can set:
.. versionadded:: 1.0
+.. confval:: autodoc_docstring_signature
+
+ Functions imported from C modules cannot be introspected, and therefore the
+ signature for such functions cannot be automatically determined. However, it
+ is an often-used convention to put the signature into the first line of the
+ function's docstring.
+
+ If this boolean value is set to ``True`` (which is the default), autodoc will
+ look at the first line of the docstring for functions and methods, and if it
+ looks like a signature, use the line as the signature and remove it from the
+ docstring content.
+
+ .. versionadded:: 1.1
+
Docstring preprocessing
-----------------------
diff --git a/doc/ext/autosummary.rst b/doc/ext/autosummary.rst
index 9f66e510..878a3c2c 100644
--- a/doc/ext/autosummary.rst
+++ b/doc/ext/autosummary.rst
@@ -19,19 +19,21 @@ The :mod:`sphinx.ext.autosummary` extension does this in two parts:
contain links to the documented items, and short summary blurbs extracted
from their docstrings.
-2. The convenience script :program:`sphinx-autogen` or the new
+2. Optionally, the convenience script :program:`sphinx-autogen` or the new
:confval:`autosummary_generate` config value can be used to generate short
"stub" files for the entries listed in the :rst:dir:`autosummary` directives.
- These by default contain only the corresponding :mod:`sphinx.ext.autodoc`
- directive.
+ These files by default contain only the corresponding :mod:`sphinx.ext.autodoc`
+ directive, but can be customized with templates.
.. rst:directive:: autosummary
Insert a table that contains links to documented items, and a short summary
- blurb (the first sentence of the docstring) for each of them. The
- :rst:dir:`autosummary` directive can also optionally serve as a :rst:dir:`toctree`
- entry for the included items.
+ blurb (the first sentence of the docstring) for each of them.
+
+ The :rst:dir:`autosummary` directive can also optionally serve as a
+ :rst:dir:`toctree` entry for the included items. Optionally, stub
+ ``.rst`` files for these items can also be automatically generated.
For example, ::
diff --git a/doc/ext/coverage.rst b/doc/ext/coverage.rst
index 13294f8b..839478fe 100644
--- a/doc/ext/coverage.rst
+++ b/doc/ext/coverage.rst
@@ -14,6 +14,7 @@ This extension features one additional builder, the :class:`CoverageBuilder`.
.. todo:: Write this section.
+
Several new configuration values can be used to specify what the builder
should check:
@@ -28,3 +29,16 @@ should check:
.. confval:: coverage_c_regexes
.. confval:: coverage_ignore_c_items
+
+.. confval:: coverage_write_headline
+
+ Set to ``False`` to not write headlines.
+
+ .. versionadded:: 1.1
+
+.. confval:: coverage_skip_undoc_in_source
+
+ Skip objects that are not documented in the source with a docstring.
+ ``False`` by default.
+
+ .. versionadded:: 1.1
diff --git a/doc/ext/doctest.rst b/doc/ext/doctest.rst
index 20e747de..554987ee 100644
--- a/doc/ext/doctest.rst
+++ b/doc/ext/doctest.rst
@@ -45,6 +45,14 @@ names.
but executed before the doctests of the group(s) it belongs to.
+.. rst:directive:: .. testcleanup:: [group]
+
+ A cleanup code block. This code is not shown in the output for other
+ builders, but executed after the doctests of the group(s) it belongs to.
+
+ .. versionadded:: 1.1
+
+
.. rst:directive:: .. doctest:: [group]
A doctest-style code block. You can use standard :mod:`doctest` flags for
@@ -181,6 +189,14 @@ There are also these config values for customizing the doctest extension:
.. versionadded:: 0.6
+.. confval:: doctest_global_cleanup
+
+ Python code that is treated like it were put in a ``testcleanup`` directive
+ for *every* file that is tested, and for every group. You can use this to
+ e.g. remove any temporary files that the tests leave behind.
+
+ .. versionadded:: 1.1
+
.. confval:: doctest_test_doctest_blocks
If this is a nonempty string (the default is ``'default'``), standard reST
@@ -221,4 +237,4 @@ There are also these config values for customizing the doctest extension:
will be interpreted as one block ending and another one starting. Also,
removal of ``<BLANKLINE>`` and ``# doctest:`` options only works in
:rst:dir:`doctest` blocks, though you may set :confval:`trim_doctest_flags` to
- achieve the latter in all code blocks with Python console content.
+ achieve that in all code blocks with Python console content.
diff --git a/doc/ext/extlinks.rst b/doc/ext/extlinks.rst
index d4478c5b..d8bcaa52 100644
--- a/doc/ext/extlinks.rst
+++ b/doc/ext/extlinks.rst
@@ -27,11 +27,11 @@ The extension adds one new config value:
short alias names to a base URL and a *prefix*. For example, to create an
alias for the above mentioned issues, you would add ::
- extlinks = {'issue': ('http://bitbucket.org/birkenfeld/sphinx/issue/%s',
+ extlinks = {'issue': ('https://bitbucket.org/birkenfeld/sphinx/issue/%s',
'issue ')}
Now, you can use the alias name as a new role, e.g. ``:issue:`123```. This
- then inserts a link to http://bitbucket.org/birkenfeld/sphinx/issue/123.
+ then inserts a link to https://bitbucket.org/birkenfeld/sphinx/issue/123.
As you can see, the target given in the role is substituted in the base URL
in the place of ``%s``.
diff --git a/doc/ext/graphviz.rst b/doc/ext/graphviz.rst
index 3741cec6..9b34b48f 100644
--- a/doc/ext/graphviz.rst
+++ b/doc/ext/graphviz.rst
@@ -29,6 +29,17 @@ It adds these directives:
:confval:`graphviz_output_format`). In LaTeX output, the code will be
rendered to an embeddable PDF file.
+ You can also embed external dot files, by giving the file name as an
+ argument to :rst:dir:`graphviz` and no additional content::
+
+ .. graphviz:: external.dot
+
+ As for all file references in Sphinx, if the filename is absolute, it is
+ taken as relative to the source directory.
+
+ .. versionchanged:: 1.1
+ Added support for external files.
+
.. rst:directive:: graph
@@ -61,6 +72,16 @@ It adds these directives:
alternate text for HTML output. If not given, the alternate text defaults to
the graphviz code.
+.. versionadded:: 1.1
+ All three directives support an ``inline`` flag that controls paragraph
+ breaks in the output. When set, the graph is inserted into the current
+ paragraph. If the flag is not given, paragraph breaks are introduced before
+ and after the image (the default).
+
+.. versionadded:: 1.1
+ All three directives support a ``caption`` option that can be used to give a
+ caption to the diagram. Naturally, diagrams marked as "inline" cannot have a
+ caption.
There are also these new config values:
diff --git a/doc/ext/inheritance.rst b/doc/ext/inheritance.rst
index cdd01791..5e0a76fc 100644
--- a/doc/ext/inheritance.rst
+++ b/doc/ext/inheritance.rst
@@ -30,6 +30,13 @@ It adds this directive:
``lib.``, you can give ``:parts: 1`` to remove that prefix from the displayed
node names.)
+ It also supports a ``private-bases`` flag option; if given, private base
+ classes (those whose name starts with ``_``) will be included.
+
+ .. versionchanged:: 1.1
+ Added ``private-bases`` option; previously, all bases were always
+ included.
+
New config values are:
diff --git a/doc/ext/math.rst b/doc/ext/math.rst
index f2896c39..434c657b 100644
--- a/doc/ext/math.rst
+++ b/doc/ext/math.rst
@@ -4,22 +4,21 @@ Math support in Sphinx
======================
.. module:: sphinx.ext.mathbase
- :synopsis: Common math support for pngmath and jsmath.
+ :synopsis: Common math support for pngmath and mathjax / jsmath.
.. versionadded:: 0.5
Since mathematical notation isn't natively supported by HTML in any way, Sphinx
-supports math in documentation with two extensions.
+supports math in documentation with several extensions.
-The basic math support that is common to both extensions is contained in
-:mod:`sphinx.ext.mathbase`. Other math support extensions should,
-if possible, reuse that support too.
+The basic math support is contained in :mod:`sphinx.ext.mathbase`. Other math
+support extensions should, if possible, reuse that support too.
.. note::
:mod:`.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.
+ :mod:`sphinx.ext.mathjax` 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
@@ -64,10 +63,10 @@ further translation is necessary when building LaTeX output.
.. math:: (a + b)^2 = a^2 + 2ab + b^2
Normally, equations are not numbered. If you want your equation to get a
- number, use the ``label`` option. When given, it selects a label for the
- equation, by which it can be cross-referenced, and causes an equation number
- to be issued. See :rst:role:`eqref` for an example. The numbering style depends
- on the output format.
+ number, use the ``label`` option. When given, it selects an internal label
+ for the equation, by which it can be cross-referenced, and causes an equation
+ number to be issued. See :rst:role:`eqref` for an example. The numbering
+ style depends on the output format.
There is also an option ``nowrap`` that prevents any wrapping of the given
math in a math environment. When you give this option, you must make sure
@@ -103,7 +102,8 @@ This extension renders math via LaTeX and dvipng_ into PNG images. This of
course means that the computer where the docs are built must have both programs
available.
-There are various config values you can set to influence how the images are built:
+There are various config values you can set to influence how the images are
+built:
.. confval:: pngmath_latex
@@ -170,20 +170,58 @@ There are various config values you can set to influence how the images are buil
Unfortunately, this only works when the `preview-latex package`_ is
installed. Therefore, the default for this option is ``False``.
+.. confval:: pngmath_add_tooltips
-:mod:`sphinx.ext.jsmath` -- Render math via JavaScript
-------------------------------------------------------
+ Default: true. If false, do not add the LaTeX code as an "alt" attribute for
+ math images.
-.. module:: sphinx.ext.jsmath
- :synopsis: Render math via JavaScript.
+ .. versionadded:: 1.1
+
+
+:mod:`sphinx.ext.mathjax` -- Render math via JavaScript
+-------------------------------------------------------
+
+.. module:: sphinx.ext.mathjax
+ :synopsis: Render math using JavaScript via MathJax.
+
+.. versionadded:: 1.1
This extension puts math as-is into the HTML files. The JavaScript package
-jsMath_ is then loaded and transforms the LaTeX markup to readable math live in
+MathJax_ is then loaded and transforms the LaTeX markup to readable math live in
the browser.
-Because jsMath (and the necessary fonts) is very large, it is not included in
-Sphinx. You must install it yourself, and give Sphinx its path in this config
-value:
+Because MathJax (and the necessary fonts) is very large, it is not included in
+Sphinx.
+
+.. confval:: mathjax_path
+
+ The path to the JavaScript file to include in the HTML files in order to load
+ MathJax.
+
+ The default is the ``http://`` URL that loads the JS files from the `MathJax
+ CDN <http://www.mathjax.org/docs/1.1/start.html>`_. If you want MathJax to
+ be available offline, you have to donwload it and set this value to a
+ different path.
+
+ The path can be absolute or relative; if it is relative, it is relative to
+ the ``_static`` directory of the built docs.
+
+ For example, if you put MathJax into the static path of the Sphinx docs, this
+ value would be ``MathJax/MathJax.js``. If you host more than one Sphinx
+ documentation set on one server, it is advisable to install MathJax in a
+ shared location.
+
+ You can also give a full ``http://`` URL different from the CDN URL.
+
+
+:mod:`sphinx.ext.jsmath` -- Render math via JavaScript
+------------------------------------------------------
+
+.. module:: sphinx.ext.jsmath
+ :synopsis: Render math using JavaScript via JSMath.
+
+This extension works just as the MathJax extension does, but uses the older
+package jsMath_. It provides this config value:
.. confval:: jsmath_path
@@ -200,6 +238,7 @@ value:
.. _dvipng: http://savannah.nongnu.org/projects/dvipng/
+.. _MathJax: http://www.mathjax.org/
.. _jsMath: http://www.math.union.edu/~dpvc/jsmath/
.. _preview-latex package: http://www.gnu.org/software/auctex/preview-latex.html
-.. _AmSMath LaTeX package: http://www.ams.org/tex/amslatex.html
+.. _AmSMath LaTeX package: http://www.ams.org/publications/authors/tex/amslatex
diff --git a/doc/extensions.rst b/doc/extensions.rst
index e05d4e9e..b9397448 100644
--- a/doc/extensions.rst
+++ b/doc/extensions.rst
@@ -70,8 +70,8 @@ If you write an extension that you think others will find useful or you think
should be included as a part of Sphinx, please write to the project mailing
list (`join here <http://groups.google.com/group/sphinx-dev>`_).
-.. _Wiki at BitBucket: http://www.bitbucket.org/birkenfeld/sphinx/wiki/Home
-.. _Sphinx Contrib: http://www.bitbucket.org/birkenfeld/sphinx-contrib
+.. _Wiki at BitBucket: https://www.bitbucket.org/birkenfeld/sphinx/wiki/Home
+.. _Sphinx Contrib: https://www.bitbucket.org/birkenfeld/sphinx-contrib
Where to put your own extensions?
diff --git a/doc/faq.rst b/doc/faq.rst
index d91cc783..965a1986 100644
--- a/doc/faq.rst
+++ b/doc/faq.rst
@@ -42,6 +42,13 @@ How do I...
Using Sphinx with...
--------------------
+Read the Docs
+ http://readthedocs.org is a documentation hosting service based around Sphinx.
+ They will host sphinx documentation, along with supporting a number of other
+ features including version support, PDF generation, and more. The `Getting
+ Started <http://read-the-docs.readthedocs.org/en/latest/getting_started.html>`_
+ guide is a good place to start.
+
Epydoc
There's a third-party extension providing an `api role`_ which refers to
Epydoc's API docs for a given identifier.
@@ -52,7 +59,7 @@ Doxygen
SCons
Glenn Hutchings has written a SCons build script to build Sphinx
- documentation; it is hosted here: http://bitbucket.org/zondo/sphinx-scons
+ documentation; it is hosted here: https://bitbucket.org/zondo/sphinx-scons
PyPI
Jannis Leidel wrote a `setuptools command
@@ -60,12 +67,14 @@ PyPI
Sphinx documentation to the PyPI package documentation area at
http://packages.python.org/.
-MediaWiki
- See http://bitbucket.org/kevindunn/sphinx-wiki, a project by Kevin Dunn.
+GitHub Pages
+ Directories starting with underscores are ignored by default which breaks
+ static files in Sphinx. GitHub's preprocessor can be `disabled
+ <https://github.com/blog/572-bypassing-jekyll-on-github-pages>`_ to support
+ Sphinx HTML output properly.
-github pages
- You'll have to opt out of processing your pages with the "Jekyll" preprocessor
- as described in http://pages.github.com/#using_jekyll_for_complex_layouts.
+MediaWiki
+ See https://bitbucket.org/kevindunn/sphinx-wiki, a project by Kevin Dunn.
Google Analytics
You can use a custom ``layout.html`` template, like this:
@@ -150,3 +159,108 @@ some notes:
.. _Calibre: http://calibre-ebook.com/
.. _FBreader: http://www.fbreader.org/
.. _Bookworm: http://bookworm.oreilly.com/
+
+
+.. _texinfo-faq:
+
+Texinfo info
+------------
+
+The Texinfo builder is currently in an experimental stage but has successfully
+been used to build the documentation for both Sphinx and Python. The intended
+use of this builder is to generate Texinfo that is then processed into Info
+files.
+
+There are two main programs for reading Info files, ``info`` and GNU Emacs. The
+``info`` program has less features but is available in most Unix environments
+and can be quickly accessed from the terminal. Emacs provides better font and
+color display and supports extensive customization (of course).
+
+
+.. _texinfo-links:
+
+Displaying Links
+~~~~~~~~~~~~~~~~
+
+One noticeable problem you may encounter with the generated Info files is how
+references are displayed. If you read the source of an Info file, a reference
+to this section would look like::
+
+ * note Displaying Links: target-id
+
+In the stand-alone reader, ``info``, references are displayed just as they
+appear in the source. Emacs, on the other-hand, will by default replace
+``\*note:`` with ``see`` and hide the ``target-id``. For example:
+
+ :ref:`texinfo-links`
+
+The exact behavior of how Emacs displays references is dependent on the variable
+``Info-hide-note-references``. If set to the value of ``hide``, Emacs will hide
+both the ``\*note:`` part and the ``target-id``. This is generally the best way
+to view Sphinx-based documents since they often make frequent use of links and
+do not take this limitation into account. However, changing this variable
+affects how all Info documents are displayed and most due take this behavior
+into account.
+
+If you want Emacs to display Info files produced by Sphinx using the value
+``hide`` for ``Info-hide-note-references`` and the default value for all other
+Info files, try adding the following Emacs Lisp code to your start-up file,
+``~/.emacs.d/init.el``.
+
+::
+
+ (defadvice info-insert-file-contents (after
+ sphinx-info-insert-file-contents
+ activate)
+ "Hack to make `Info-hide-note-references' buffer-local and
+ automatically set to `hide' iff it can be determined that this file
+ was created from a Texinfo file generated by Docutils or Sphinx."
+ (set (make-local-variable 'Info-hide-note-references)
+ (default-value 'Info-hide-note-references))
+ (save-excursion
+ (save-restriction
+ (widen) (goto-char (point-min))
+ (when (re-search-forward
+ "^Generated by \\(Sphinx\\|Docutils\\)"
+ (save-excursion (search-forward "\x1f" nil t)) t)
+ (set (make-local-variable 'Info-hide-note-references)
+ 'hide)))))
+
+
+Notes
+~~~~~
+
+The following notes may be helpful if you want to create Texinfo files:
+
+- Each section corresponds to a different ``node`` in the Info file.
+
+- Colons (``:``) cannot be properly escaped in menu entries and xrefs.
+ They will be replaced with semicolons (``;``).
+
+- In the HTML and Tex output, the word ``see`` is automatically inserted before
+ all xrefs.
+
+- Links to external Info files can be created using the somewhat official URI
+ scheme ``info``. For example::
+
+ info:Texinfo#makeinfo_options
+
+ which produces:
+
+ info:Texinfo#makeinfo_options
+
+- Inline markup appears as follows in Info:
+
+ * strong -- \*strong\*
+ * emphasis -- _emphasis_
+ * literal -- \`literal'
+
+ It is possible to change this behavior using the Texinfo command
+ ``@definfoenclose``. For example, to make inline markup more closely resemble
+ reST, add the following to your :file:`conf.py`::
+
+ texinfo_elements = {'preamble': """\
+ @definfoenclose strong,**,**
+ @definfoenclose emph,*,*
+ @definfoenclose code,`@w{}`,`@w{}`
+ """}
diff --git a/doc/glossary.rst b/doc/glossary.rst
index 2a82e20f..8bc393eb 100644
--- a/doc/glossary.rst
+++ b/doc/glossary.rst
@@ -23,7 +23,9 @@ Glossary
A reStructuredText markup element that allows marking a block of content
with special meaning. Directives are supplied not only by docutils, but
Sphinx and custom extensions can add their own. The basic directive
- syntax looks like this::
+ syntax looks like this:
+
+ .. sourcecode:: rst
.. directivename:: argument ...
:option: value
diff --git a/doc/intl.rst b/doc/intl.rst
new file mode 100644
index 00000000..6a5471c4
--- /dev/null
+++ b/doc/intl.rst
@@ -0,0 +1,69 @@
+.. _intl:
+
+Internationalization
+====================
+
+.. versionadded:: 1.1
+
+Complementary to translations provided for Sphinx-generated messages such as
+navigation bars, Sphinx provides mechanisms facilitating *document* translations
+in itself. See the :ref:`intl-options` for details on configuration.
+
+.. figure:: translation.png
+ :width: 100%
+
+ Workflow visualization of translations in Sphinx. (The stick-figure is taken
+ from an `XKCD comic <http://xkcd.com/779/>`_.)
+
+**gettext** [1]_ is an established standard for internationalization and
+localization. It naïvely maps messages in a program to a translated string.
+Sphinx uses these facilities to translate whole documents.
+
+Initially project maintainers have to collect all translatable strings (also
+referred to as *messages*) to make them known to translators. Sphinx extracts
+these through invocation of ``sphinx-build -b gettext``.
+
+Every single element in the doctree will end up in a single message which
+results in lists being equally split into different chunks while large
+paragraphs will remain as coarsely-grained as they were in the original
+document. This grants seamless document updates while still providing a little
+bit of context for translators in free-text passages. It is the maintainer's
+task to split up paragraphs which are too large as there is no sane automated
+way to do that.
+
+After Sphinx successfully ran the
+:class:`~sphinx.builders.gettext.MessageCatalogBuilder` you will find a collection
+of ``.pot`` files in your output directory. These are **catalog templates**
+and contain messages in your original language *only*.
+
+They can be delivered to translators which will transform them to ``.po`` files
+--- so called **message catalogs** --- containing a mapping from the original
+messages to foreign-language strings.
+
+Gettext compiles them into a binary format known as **binary catalogs** through
+:program:`msgfmt` for efficiency reasons. If you make these files discoverable
+with :confval:`locale_dirs` for your :confval:`language`, Sphinx will pick them
+up automatically.
+
+An example: you have a document ``usage.rst`` in your Sphinx project. The
+gettext builder will put its messages into ``usage.pot``. Image you have
+Spanish translations [2]_ on your hands in ``usage.po`` --- for your builds to
+be translated you need to follow these instructions:
+
+* Compile your message catalog to a locale directory, say ``translated``, so it
+ ends up in ``./translated/es/LC_MESSAGES/usage.mo`` in your source directory
+ (where ``es`` is the language code for Spanish.) ::
+
+ msgfmt "usage.po" -o "translated/es/LC_MESSAGES/usage.mo"
+
+* Set :confval:`locale_dirs` to ``["translated/"]``.
+* Set :confval:`language` to ``es`` (also possible via :option:`-D`).
+* Run your desired build.
+
+
+.. rubric:: Footnotes
+
+.. [1] See the `GNU gettext utilites
+ <http://www.gnu.org/software/gettext/manual/gettext.html#Introduction>`_
+ for details on that software suite.
+.. [2] Because nobody expects the Spanish Inquisition!
diff --git a/doc/intro.rst b/doc/intro.rst
index ef8ef930..46e4436b 100644
--- a/doc/intro.rst
+++ b/doc/intro.rst
@@ -24,8 +24,7 @@ This section is intended to collect helpful hints for those wanting to migrate
to reStructuredText/Sphinx from other documentation systems.
* Gerard Flanagan has written a script to convert pure HTML to reST; it can be
- found at `BitBucket
- <http://bitbucket.org/djerdo/musette/src/tip/musette/html/html2rest.py>`_.
+ found at the `Python Package Index <http://pypi.python.org/pypi/html2rest>`_.
* For converting the old Python docs to Sphinx, a converter was written which
can be found at `the Python SVN repository
@@ -51,15 +50,19 @@ See the :ref:`pertinent section in the FAQ list <usingwith>`.
Prerequisites
-------------
-Sphinx needs at least **Python 2.4** to run, as well as the docutils_ and
-Jinja2_ libraries. Sphinx should work with docutils version 0.5 or some
-(not broken) SVN trunk snapshot. If you like to have source code highlighting
-support, you must also install the Pygments_ library.
+Sphinx needs at least **Python 2.4** or **Python 3.1** to run, as well as the
+docutils_ and Jinja2_ libraries. Sphinx should work with docutils version 0.5
+or some (not broken) SVN trunk snapshot. If you like to have source code
+highlighting support, you must also install the Pygments_ library.
+
+If you use **Python 2.4** you also need uuid_.
.. _reStructuredText: http://docutils.sf.net/rst.html
.. _docutils: http://docutils.sf.net/
-.. _Jinja2: http://jinja.pocoo.org/2/
+.. _Jinja2: http://jinja.pocoo.org/
.. _Pygments: http://pygments.org/
+.. The given homepage is only a directory listing so I'm using the pypi site.
+.. _uuid: http://pypi.python.org/pypi/uuid/
Usage
diff --git a/doc/invocation.rst b/doc/invocation.rst
index 6b8b9ee3..2c69d32f 100644
--- a/doc/invocation.rst
+++ b/doc/invocation.rst
@@ -14,6 +14,8 @@ you don't need to specify any *filenames*.
The :program:`sphinx-build` script has several options:
+.. program:: sphinx-build
+
.. option:: -b buildername
The most important option: it selects a builder. The most common builders
@@ -40,9 +42,16 @@ The :program:`sphinx-build` script has several options:
**man**
Build manual pages in groff format for UNIX systems.
+ **texinfo**
+ Build Texinfo files that can be processed into Info files using
+ :program:`makeinfo`.
+
**text**
Build plain text files.
+ **gettext**
+ Build gettext-style message catalogs (``.pot`` files).
+
**doctest**
Run all doctests in the documentation, if the :mod:`~sphinx.ext.doctest`
extension is enabled.
@@ -176,3 +185,72 @@ variables to customize behavior:
.. describe:: SPHINXOPTS
Additional options for :program:`sphinx-build`.
+
+
+.. _invocation-apidoc:
+
+Invocation of sphinx-apidoc
+===========================
+
+The :program:`sphinx-apidoc` generates completely automatic API documentation
+for a Python package. It is called like this::
+
+ $ sphinx-apidoc [options] -o outputdir packagedir [pathnames]
+
+where *packagedir* is the path to the package to document, and *outputdir* is
+the directory where the generated sources are placed. Any *pathnames* given
+are paths to be excluded ignored during generation.
+
+The :program:`sphinx-apidoc` script has several options:
+
+.. program:: sphinx-apidoc
+
+.. option:: -o outputdir
+
+ Gives the directory in which to place the generated output.
+
+.. option:: -f, --force
+
+ Normally, sphinx-apidoc does not overwrite any files. Use this option to
+ force the overwrite of all files that it generates.
+
+.. option:: -n, --dry-run
+
+ With this option given, no files will be written at all.
+
+.. option:: -s suffix
+
+ This option selects the file name suffix of output files. By default, this
+ is ``rst``.
+
+.. option:: -d maxdepth
+
+ This sets the maximum depth of the table of contents, if one is generated.
+
+.. option:: -T, --no-toc
+
+ This prevents the generation of a table-of-contents file ``modules.rst``.
+ This has no effect when :option:`--full` is given.
+
+.. option:: -F, --full
+
+ This option makes sphinx-apidoc create a full Sphinx project, using the same
+ mechanism as :program:`sphinx-quickstart`. Most configuration values are set
+ to default values, but you can influence the most important ones using the
+ following options.
+
+.. option:: -H project
+
+ Sets the project name to put in generated files (see :confval:`project`).
+
+.. option:: -A author
+
+ Sets the author name(s) to put in generated files (see :confval:`copyright`).
+
+.. option:: -V version
+
+ Sets the project version to put in generated files (see :confval:`version`).
+
+.. option:: -R release
+
+ Sets the project release to put in generated files (see :confval:`release`).
diff --git a/doc/man/sphinx-apidoc.rst b/doc/man/sphinx-apidoc.rst
new file mode 100644
index 00000000..e48102de
--- /dev/null
+++ b/doc/man/sphinx-apidoc.rst
@@ -0,0 +1,55 @@
+:orphan:
+
+sphinx-apidoc manual page
+=========================
+
+Synopsis
+--------
+
+**sphinx-apidoc** [*options*] -o <*outputdir*> <*sourcedir*> [*pathnames* ...]
+
+
+Description
+-----------
+
+:program:`sphinx-apidoc` is a tool for automatic generation of Sphinx sources
+that, using the autodoc extension, document a whole package in the style of
+other automatic API documentation tools.
+
+*sourcedir* must point to a Python package. Any *pathnames* given are paths to
+be excluded from the generation.
+
+
+Options
+-------
+
+-o <outputdir> Directory to place the output files. If it does not exist,
+ it is created.
+-f, --force Usually, apidoc does not overwrite files, unless this option
+ is given.
+-n, --dry-run If given, apidoc does not create any files.
+-s <suffix> Suffix for the source files generated, default is ``rst``.
+-d <maxdepth> Maximum depth for the generated table of contents file.
+-T, --no-toc Do not create a table of contents file.
+-F, --full If given, a full Sphinx project is generated (``conf.py``,
+ ``Makefile`` etc.) using sphinx-quickstart.
+
+These options are used with ``-F``:
+
+-H <project> Project name to put into the configuration.
+-A <author> Author name(s) to put into the configuration.
+-V <version> Project version.
+-R <release> Project release.
+
+
+See also
+--------
+
+:manpage:`sphinx-build(1)`
+
+
+Author
+------
+
+Etienne Desautels, <etienne.desautels@gmail.com>, Georg Brandl
+<georg@python.org> et al.
diff --git a/doc/man/sphinx-build.rst b/doc/man/sphinx-build.rst
index 30f824e8..b7212a84 100644
--- a/doc/man/sphinx-build.rst
+++ b/doc/man/sphinx-build.rst
@@ -47,6 +47,10 @@ latex
man
Generates manual pages.
+texinfo
+ Generates Texinfo output that can be processed by :program:`makeinfo` to
+ generate an Info document.
+
text
Generates a plain-text version of the documentation.
diff --git a/doc/markup/code.rst b/doc/markup/code.rst
index eaaf17d0..c0e7e8eb 100644
--- a/doc/markup/code.rst
+++ b/doc/markup/code.rst
@@ -86,6 +86,21 @@ on line numbers for the individual block::
Some more Ruby code.
+Additionally, an ``emphasize-lines`` option can be given to have Pygments
+emphasize particular lines::
+
+ .. code-block:: python
+ :emphasize-lines: 3,5
+
+ def some_function():
+ interesting = False
+ print 'This line is highlighted.'
+ print 'This one is not...'
+ print '...but this one is.'
+
+.. versionchanged:: 1.1
+ ``emphasize-lines`` has been added.
+
Includes
^^^^^^^^
@@ -107,11 +122,13 @@ Includes
desired tab width.
The directive also supports the ``linenos`` flag option to switch on line
- numbers, and a ``language`` option to select a language different from the
- current file's standard language. Example with options::
+ numbers, the ``emphasize-lines`` option to emphasize particular lines, and
+ a ``language`` option to select a language different from the current
+ file's standard language. Example with options::
.. literalinclude:: example.rb
:language: ruby
+ :emphasize-lines: 12,15-18
:linenos:
Include files are assumed to be encoded in the :confval:`source_encoding`.
diff --git a/doc/markup/inline.rst b/doc/markup/inline.rst
index 4f90a6a7..69dd832f 100644
--- a/doc/markup/inline.rst
+++ b/doc/markup/inline.rst
@@ -321,6 +321,7 @@ in a different style:
If you don't need the "variable part" indication, use the standard
````code```` instead.
+There is also an :rst:role:`index` role to generate index entries.
The following roles generate external links:
diff --git a/doc/markup/misc.rst b/doc/markup/misc.rst
index 0dfc1e21..f5eaac9c 100644
--- a/doc/markup/misc.rst
+++ b/doc/markup/misc.rst
@@ -64,6 +64,105 @@ Meta-information markup
:confval:`show_authors` configuration value is True.
+Index-generating markup
+-----------------------
+
+Sphinx automatically creates index entries from all object descriptions (like
+functions, classes or attributes) like discussed in :ref:`domains`.
+
+However, there is also explicit markup available, to make the index more
+comprehensive and enable index entries in documents where information is not
+mainly contained in information units, such as the language reference.
+
+.. rst:directive:: .. index:: <entries>
+
+ This directive contains one or more index entries. Each entry consists of a
+ type and a value, separated by a colon.
+
+ For example::
+
+ .. index::
+ single: execution; context
+ module: __main__
+ module: sys
+ triple: module; search; path
+
+ The execution context
+ ---------------------
+
+ ...
+
+ This directive contains five entries, which will be converted to entries in
+ the generated index which link to the exact location of the index statement
+ (or, in case of offline media, the corresponding page number).
+
+ Since index directives generate cross-reference targets at their location in
+ the source, it makes sense to put them *before* the thing they refer to --
+ e.g. a heading, as in the example above.
+
+ The possible entry types are:
+
+ single
+ Creates a single index entry. Can be made a subentry by separating the
+ subentry text with a semicolon (this notation is also used below to
+ describe what entries are created).
+ pair
+ ``pair: loop; statement`` is a shortcut that creates two index entries,
+ namely ``loop; statement`` and ``statement; loop``.
+ triple
+ Likewise, ``triple: module; search; path`` is a shortcut that creates
+ three index entries, which are ``module; search path``, ``search; path,
+ module`` and ``path; module search``.
+ see
+ ``see: entry; other`` creates an index entry that refers from ``entry`` to
+ ``other``.
+ seealso
+ Like ``see``, but inserts "see also" instead of "see".
+ module, keyword, operator, object, exception, statement, builtin
+ These all create two index entries. For example, ``module: hashlib``
+ creates the entries ``module; hashlib`` and ``hashlib; module``. (These
+ are Python-specific and therefore deprecated.)
+
+ You can mark up "main" index entries by prefixing them with an exclamation
+ mark. The references to "main" entries are emphasized in the generated
+ index. For example, if two pages contain ::
+
+ .. index:: Python
+
+ and one page contains ::
+
+ .. index:: ! Python
+
+ then the backlink to the latter page is emphasized among the three backlinks.
+
+ For index directives containing only "single" entries, there is a shorthand
+ notation::
+
+ .. index:: BNF, grammar, syntax, notation
+
+ This creates four index entries.
+
+ .. versionchanged:: 1.1
+ Added ``see`` and ``seealso`` types, as well as marking main entries.
+
+.. rst:role:: index
+
+ While the :rst:dir:`index` directive is a block-level markup and links to the
+ beginning of the next paragraph, there is also a corresponding role that sets
+ the link target directly where it is used.
+
+ The content of the role can be a simple phrase, which is then kept in the
+ text and used as an index entry. It can also be a combination of text and
+ index entry, styled like with explicit targets of cross-references. In that
+ case, the "target" part can be a full entry as described for the directive
+ above. For example::
+
+ This is a normal reST :index:`paragraph` that contains several
+ :index:`index entries <pair: index; entry>`.
+
+ .. versionadded:: 1.1
+
+
.. _tags:
Including content based on tags
diff --git a/doc/markup/para.rst b/doc/markup/para.rst
index ecc6b4a6..b532bc63 100644
--- a/doc/markup/para.rst
+++ b/doc/markup/para.rst
@@ -52,7 +52,7 @@ units as well as normal text:
Similar to :rst:dir:`versionadded`, but describes when and what changed in
the named feature in some way (new parameters, changed side effects, etc.).
-.. rst:directive:: .. deprecated:: vesion
+.. rst:directive:: .. deprecated:: version
Similar to :rst:dir:`versionchanged`, but describes when the feature was
deprecated. An explanation can also be given, for example to inform the
@@ -112,6 +112,10 @@ units as well as normal text:
.. centered:: LICENSE AGREEMENT
+ .. deprecated:: 1.1
+ This presentation-only directive is a legacy from older versions. Use a
+ :rst:dir:`rst-class` directive instead and add an appropriate style.
+
.. rst:directive:: hlist
@@ -141,69 +145,7 @@ The :rst:dir:`toctree` directive, which generates tables of contents of
subdocuments, is described in :ref:`toctree-directive`.
For local tables of contents, use the standard reST :dudir:`contents directive
-<contents>`.
-
-
-Index-generating markup
------------------------
-
-Sphinx automatically creates index entries from all object descriptions (like
-functions, classes or attributes) like discussed in :ref:`domains`.
-
-However, there is also an explicit directive available, to make the index more
-comprehensive and enable index entries in documents where information is not
-mainly contained in information units, such as the language reference.
-
-.. rst:directive:: .. index:: <entries>
-
- This directive contains one or more index entries. Each entry consists of a
- type and a value, separated by a colon.
-
- For example::
-
- .. index::
- single: execution; context
- module: __main__
- module: sys
- triple: module; search; path
-
- The execution context
- ---------------------
-
- ...
-
- This directive contains five entries, which will be converted to entries in
- the generated index which link to the exact location of the index statement
- (or, in case of offline media, the corresponding page number).
-
- Since index directives generate cross-reference targets at their location in
- the source, it makes sense to put them *before* the thing they refer to --
- e.g. a heading, as in the example above.
-
- The possible entry types are:
-
- single
- Creates a single index entry. Can be made a subentry by separating the
- subentry text with a semicolon (this notation is also used below to
- describe what entries are created).
- pair
- ``pair: loop; statement`` is a shortcut that creates two index entries,
- namely ``loop; statement`` and ``statement; loop``.
- triple
- Likewise, ``triple: module; search; path`` is a shortcut that creates
- three index entries, which are ``module; search path``, ``search; path,
- module`` and ``path; module search``.
- module, keyword, operator, object, exception, statement, builtin
- These all create two index entries. For example, ``module: hashlib``
- creates the entries ``module; hashlib`` and ``hashlib; module``. (These
- are Python-specific and therefore deprecated.)
-
- For index directives containing only "single" entries, there is a shorthand
- notation::
-
- .. index:: BNF, grammar, syntax, notation
-
- This creates four index entries.
+<table-of-contents>`.
Glossary
@@ -211,9 +153,9 @@ Glossary
.. rst:directive:: .. glossary::
- This directive must contain a reST definition list with terms and
- definitions. The definitions will then be referencable with the :rst:role:`term`
- role. Example::
+ This directive must contain a reST definition-list-like markup with terms and
+ definitions. The definitions will then be referencable with the
+ :rst:role:`term` role. Example::
.. glossary::
@@ -227,10 +169,25 @@ Glossary
The directory which, including its subdirectories, contains all
source files for one Sphinx project.
+ In contrast to regular definition lists, *multiple* terms per entry are
+ allowed, and inline markup is allowed in terms. You can link to all of the
+ terms. For example::
+
+ .. glossary::
+
+ term 1
+ term 2
+ Definition of both terms.
+
+ (When the glossary is sorted, the first term determines the sort order.)
+
.. versionadded:: 0.6
You can now give the glossary directive a ``:sorted:`` flag that will
automatically sort the entries alphabetically.
+ .. versionchanged:: 1.1
+ Now supports multiple terms and inline markup in terms.
+
Grammar production displays
---------------------------
diff --git a/doc/markup/toctree.rst b/doc/markup/toctree.rst
index b9eb0ebf..625fbb61 100644
--- a/doc/markup/toctree.rst
+++ b/doc/markup/toctree.rst
@@ -46,6 +46,8 @@ tables of contents. The ``toctree`` directive is the central element.
document, the library index. From this information it generates "next
chapter", "previous chapter" and "parent chapter" links.
+ **Entries**
+
Document titles in the :rst:dir:`toctree` will be automatically read from the
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
@@ -64,8 +66,10 @@ tables of contents. The ``toctree`` directive is the central element.
You can also add external links, by giving an HTTP URL instead of a document
name.
+ **Section numbering**
+
If you want to have section numbers even in HTML output, give the toctree a
- ``numbered`` flag option. For example::
+ ``numbered`` option. For example::
.. toctree::
:numbered:
@@ -76,6 +80,11 @@ tables of contents. The ``toctree`` directive is the central element.
Numbering then starts at the heading of ``foo``. Sub-toctrees are
automatically numbered (don't give the ``numbered`` flag to those).
+ Numbering up to a specific depth is also possible, by giving the depth as a
+ numeric argument to ``numbered``.
+
+ **Additional options**
+
If you want only the titles of documents in the tree to show up, not other
headings of the same level, you can use the ``titlesonly`` option::
@@ -138,6 +147,9 @@ tables of contents. The ``toctree`` directive is the central element.
.. versionchanged:: 1.0
Added "titlesonly" option.
+ .. versionchanged:: 1.1
+ Added numeric argument to "numbered".
+
Special names
-------------
diff --git a/doc/rest.rst b/doc/rest.rst
index 69307572..db832ed8 100644
--- a/doc/rest.rst
+++ b/doc/rest.rst
@@ -275,8 +275,8 @@ Docutils supports the following directives:
* Additional body elements:
- - :dudir:`contents` (a local, i.e. for the current file only, table of
- contents)
+ - :dudir:`contents <table-of-contents>` (a local, i.e. for the current file
+ only, table of contents)
- :dudir:`container` (a container with a custom class, useful to generate an
outer ``<div>`` in HTML)
- :dudir:`rubric` (a heading without relation to the document sectioning)
diff --git a/doc/themes/fullsize/pyramid.png b/doc/themes/fullsize/pyramid.png
new file mode 100644
index 00000000..429a8b7e
--- /dev/null
+++ b/doc/themes/fullsize/pyramid.png
Binary files differ
diff --git a/doc/themes/pyramid.png b/doc/themes/pyramid.png
new file mode 100644
index 00000000..b16095c9
--- /dev/null
+++ b/doc/themes/pyramid.png
Binary files differ
diff --git a/doc/theming.rst b/doc/theming.rst
index 716eb50a..802b211f 100644
--- a/doc/theming.rst
+++ b/doc/theming.rst
@@ -69,9 +69,9 @@ Builtin themes
| | |
| *traditional* | *nature* |
+--------------------+--------------------+
-| |haiku| | |
+| |haiku| | |pyramid| |
| | |
-| *haiku* | |
+| *haiku* | *pyramid* |
+--------------------+--------------------+
.. |default| image:: themes/default.png
@@ -81,6 +81,7 @@ Builtin themes
.. |traditional| image:: themes/traditional.png
.. |nature| image:: themes/nature.png
.. |haiku| image:: themes/haiku.png
+.. |pyramid| image:: themes/pyramid.png
Sphinx comes with a selection of themes to choose from.
@@ -88,12 +89,15 @@ These themes are:
* **basic** -- This is a basically unstyled layout used as the base for the
other themes, and usable as the base for custom themes as well. The HTML
- contains all important elements like sidebar and relation bar. There is one
- option (which is inherited by the other themes):
+ contains all important elements like sidebar and relation bar. There are
+ these options (which are inherited by the other themes):
- **nosidebar** (true or false): Don't include the sidebar. Defaults to
false.
+ - **sidebarwidth** (an integer): Width of the sidebar in pixels. (Do not
+ include ``px`` in the value.) Defaults to 230 pixels.
+
* **default** -- This is the default theme, which looks like `the Python
documentation <http://docs.python.org/>`_. It can be customized via these
options:
@@ -141,11 +145,11 @@ These themes are:
- **headfont** (CSS font-family): Font for headings.
* **sphinxdoc** -- The theme used for this documentation. It features a sidebar
- on the right side. There are currently no options beyond *nosidebar*.
+ on the right side. There are currently no options beyond *nosidebar* and
+ *sidebarwidth*.
* **scrolls** -- A more lightweight theme, based on `the Jinja documentation
- <http://jinja.pocoo.org/2/documentation/>`_. The following color options are
- available:
+ <http://jinja.pocoo.org/>`_. The following color options are available:
- **headerbordercolor**
- **subheadlinecolor**
@@ -176,7 +180,11 @@ These themes are:
is ``justify``.
* **nature** -- A greenish theme. There are currently no options beyond
- *nosidebar*.
+ *nosidebar* and *sidebarwidth*.
+
+* **pyramid** -- A theme from the Pyramid web framework project, designed by
+ Blaise Laflamme. There are currently no options beyond *nosidebar* and
+ *sidebarwidth*.
* **haiku** -- A theme without sidebar inspired by the `Haiku OS user guide
<http://www.haiku-os.org/docs/userguide/en/contents.html>`_. The following
@@ -190,7 +198,7 @@ These themes are:
**hoverlinkcolor** (CSS colors): Colors for various body elements.
* **traditional** -- A theme resembling the old Python documentation. There are
- currently no options beyond *nosidebar*.
+ currently no options beyond *nosidebar* and *sidebarwidth*.
* **epub** -- A theme for the epub builder. There are currently no options.
This theme tries to save visual space which is a sparse resource on ebook
@@ -206,7 +214,7 @@ name), containing the following:
* A :file:`theme.conf` file, see below.
* HTML templates, if needed.
* A ``static/`` directory containing any static files that will be copied to the
- output statid directory on build. These can be images, styles, script files.
+ output static directory on build. These can be images, styles, script files.
The :file:`theme.conf` file is in INI format [1]_ (readable by the standard
Python :mod:`ConfigParser` module) and has the following structure:
diff --git a/doc/translation.png b/doc/translation.png
new file mode 100644
index 00000000..aa368b67
--- /dev/null
+++ b/doc/translation.png
Binary files differ
diff --git a/doc/tutorial.rst b/doc/tutorial.rst
index fa6ee2ab..b0e1d486 100644
--- a/doc/tutorial.rst
+++ b/doc/tutorial.rst
@@ -26,6 +26,9 @@ configuration values from a few questions it asks you. Just run ::
and answer its questions. (Be sure to say yes to the "autodoc" extension.)
+There is also an automatic "API documentation" generator called
+:program:`sphinx-apidoc`; see :ref:`invocation-apidoc` for details.
+
Defining document structure
---------------------------
@@ -125,6 +128,12 @@ to run ::
to build HTML docs in the build directory you chose. Execute ``make`` without
an argument to see which targets are available.
+.. admonition:: How do I generate PDF documents?
+
+ ``make latexpdf`` runs the :mod:`LaTeX builder
+ <sphinx.builders.latex.LaTeXBuilder>` and readily invokes the pdfTeX
+ toolchain for you.
+
Documenting objects
-------------------
diff --git a/doc/web/api.rst b/doc/web/api.rst
new file mode 100644
index 00000000..070cd3a2
--- /dev/null
+++ b/doc/web/api.rst
@@ -0,0 +1,65 @@
+.. _websupportapi:
+
+.. currentmodule:: sphinx.websupport
+
+The WebSupport Class
+====================
+
+.. class:: WebSupport
+
+ The main API class for the web support package. All interactions with the
+ web support package should occur through this class.
+
+ The class takes the following keyword arguments:
+
+ srcdir
+ The directory containing reStructuredText source files.
+
+ builddir
+ The directory that build data and static files should be placed in. This
+ should be used when creating a :class:`WebSupport` object that will be
+ used to build data.
+
+ datadir
+ The directory that the web support data is in. This should be used when
+ creating a :class:`WebSupport` object that will be used to retrieve data.
+
+ search
+ This may contain either a string (e.g. 'xapian') referencing a built-in
+ search adapter to use, or an instance of a subclass of
+ :class:`~.search.BaseSearch`.
+
+ storage
+ This may contain either a string representing a database uri, or an
+ instance of a subclass of :class:`~.storage.StorageBackend`. If this is
+ not provided, a new sqlite database will be created.
+
+ moderation_callback
+ A callable to be called when a new comment is added that is not
+ displayed. It must accept one argument: a dictionary representing the
+ comment that was added.
+
+ staticdir
+ If static files are served from a location besides ``'/static'``, this
+ should be a string with the name of that location
+ (e.g. ``'/static_files'``).
+
+ docroot
+ If the documentation is not served from the base path of a URL, this
+ should be a string specifying that path (e.g. ``'docs'``).
+
+
+Methods
+~~~~~~~
+
+.. automethod:: sphinx.websupport.WebSupport.build
+
+.. automethod:: sphinx.websupport.WebSupport.get_document
+
+.. automethod:: sphinx.websupport.WebSupport.get_data
+
+.. automethod:: sphinx.websupport.WebSupport.add_comment
+
+.. automethod:: sphinx.websupport.WebSupport.process_vote
+
+.. automethod:: sphinx.websupport.WebSupport.get_search_results
diff --git a/doc/web/quickstart.rst b/doc/web/quickstart.rst
new file mode 100644
index 00000000..1bcd217e
--- /dev/null
+++ b/doc/web/quickstart.rst
@@ -0,0 +1,254 @@
+.. _websupportquickstart:
+
+Web Support Quick Start
+=======================
+
+Building Documentation Data
+~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+To make use of the web support package in your application you'll need to build
+the data it uses. This data includes pickle files representing documents,
+search indices, and node data that is used to track where comments and other
+things are in a document. To do this you will need to create an instance of the
+:class:`~.WebSupport` class and call its :meth:`~.WebSupport.build` method::
+
+ from sphinx.websupport import WebSupport
+
+ support = WebSupport(srcdir='/path/to/rst/sources/',
+ builddir='/path/to/build/outdir',
+ search='xapian')
+
+ support.build()
+
+This will read reStructuredText sources from `srcdir` and place the necessary
+data in `builddir`. The `builddir` will contain two sub-directories: one named
+"data" that contains all the data needed to display documents, search through
+documents, and add comments to documents. The other directory will be called
+"static" and contains static files that should be served from "/static".
+
+.. note::
+
+ If you wish to serve static files from a path other than "/static", you can
+ do so by providing the *staticdir* keyword argument when creating the
+ :class:`~.WebSupport` object.
+
+
+Integrating Sphinx Documents Into Your Webapp
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Now that the data is built, it's time to do something useful with it. Start off
+by creating a :class:`~.WebSupport` object for your application::
+
+ from sphinx.websupport import WebSupport
+
+ support = WebSupport(datadir='/path/to/the/data',
+ search='xapian')
+
+You'll only need one of these for each set of documentation you will be working
+with. You can then call it's :meth:`~.WebSupport.get_document` method to access
+individual documents::
+
+ contents = support.get_document('contents')
+
+This will return a dictionary containing the following items:
+
+* **body**: The main body of the document as HTML
+* **sidebar**: The sidebar of the document as HTML
+* **relbar**: A div containing links to related documents
+* **title**: The title of the document
+* **css**: Links to css files used by Sphinx
+* **js**: Javascript containing comment options
+
+This dict can then be used as context for templates. The goal is to be easy to
+integrate with your existing templating system. An example using `Jinja2
+<http://jinja.pocoo.org/>`_ is:
+
+.. sourcecode:: html+jinja
+
+ {%- extends "layout.html" %}
+
+ {%- block title %}
+ {{ document.title }}
+ {%- endblock %}
+
+ {% block css %}
+ {{ super() }}
+ {{ document.css|safe }}
+ <link rel="stylesheet" href="/static/websupport-custom.css" type="text/css">
+ {% endblock %}
+
+ {%- block js %}
+ {{ super() }}
+ {{ document.js|safe }}
+ {%- endblock %}
+
+ {%- block relbar %}
+ {{ document.relbar|safe }}
+ {%- endblock %}
+
+ {%- block body %}
+ {{ document.body|safe }}
+ {%- endblock %}
+
+ {%- block sidebar %}
+ {{ document.sidebar|safe }}
+ {%- endblock %}
+
+
+Authentication
+--------------
+
+To use certain features such as voting, it must be possible to authenticate
+users. The details of the authentication are left to your application. Once a
+user has been authenticated you can pass the user's details to certain
+:class:`~.WebSupport` methods using the *username* and *moderator* keyword
+arguments. The web support package will store the username with comments and
+votes. The only caveat is that if you allow users to change their username you
+must update the websupport package's data::
+
+ support.update_username(old_username, new_username)
+
+*username* should be a unique string which identifies a user, and *moderator*
+should be a boolean representing whether the user has moderation privilieges.
+The default value for *moderator* is *False*.
+
+An example `Flask <http://flask.pocoo.org/>`_ function that checks whether a
+user is logged in and then retrieves a document is::
+
+ from sphinx.websupport.errors import *
+
+ @app.route('/<path:docname>')
+ def doc(docname):
+ username = g.user.name if g.user else ''
+ moderator = g.user.moderator if g.user else False
+ try:
+ document = support.get_document(docname, username, moderator)
+ except DocumentNotFoundError:
+ abort(404)
+ return render_template('doc.html', document=document)
+
+The first thing to notice is that the *docname* is just the request path. This
+makes accessing the correct document easy from a single view. If the user is
+authenticated, then the username and moderation status are passed along with the
+docname to :meth:`~.WebSupport.get_document`. The web support package will then
+add this data to the ``COMMENT_OPTIONS`` that are used in the template.
+
+.. note::
+
+ This only works works if your documentation is served from your
+ document root. If it is served from another directory, you will
+ need to prefix the url route with that directory, and give the `docroot`
+ keyword argument when creating the web support object::
+
+ support = WebSupport(..., docroot='docs')
+
+ @app.route('/docs/<path:docname>')
+
+
+Performing Searches
+~~~~~~~~~~~~~~~~~~~
+
+To use the search form built-in to the Sphinx sidebar, create a function to
+handle requests to the url 'search' relative to the documentation root. The
+user's search query will be in the GET parameters, with the key `q`. Then use
+the :meth:`~sphinx.websupport.WebSupport.get_search_results` method to retrieve
+search results. In `Flask <http://flask.pocoo.org/>`_ that would be like this::
+
+ @app.route('/search')
+ def search():
+ q = request.args.get('q')
+ document = support.get_search_results(q)
+ return render_template('doc.html', document=document)
+
+Note that we used the same template to render our search results as we did to
+render our documents. That's because :meth:`~.WebSupport.get_search_results`
+returns a context dict in the same format that :meth:`~.WebSupport.get_document`
+does.
+
+
+Comments & Proposals
+~~~~~~~~~~~~~~~~~~~~
+
+Now that this is done it's time to define the functions that handle the AJAX
+calls from the script. You will need three functions. The first function is
+used to add a new comment, and will call the web support method
+:meth:`~.WebSupport.add_comment`::
+
+ @app.route('/docs/add_comment', methods=['POST'])
+ def add_comment():
+ parent_id = request.form.get('parent', '')
+ node_id = request.form.get('node', '')
+ text = request.form.get('text', '')
+ proposal = request.form.get('proposal', '')
+ username = g.user.name if g.user is not None else 'Anonymous'
+ comment = support.add_comment(text, node_id='node_id',
+ parent_id='parent_id',
+ username=username, proposal=proposal)
+ return jsonify(comment=comment)
+
+You'll notice that both a `parent_id` and `node_id` are sent with the
+request. If the comment is being attached directly to a node, `parent_id`
+will be empty. If the comment is a child of another comment, then `node_id`
+will be empty. Then next function handles the retrieval of comments for a
+specific node, and is aptly named
+:meth:`~sphinx.websupport.WebSupport.get_data`::
+
+ @app.route('/docs/get_comments')
+ def get_comments():
+ username = g.user.name if g.user else None
+ moderator = g.user.moderator if g.user else False
+ node_id = request.args.get('node', '')
+ data = support.get_data(node_id, username, moderator)
+ return jsonify(**data)
+
+The final function that is needed will call :meth:`~.WebSupport.process_vote`,
+and will handle user votes on comments::
+
+ @app.route('/docs/process_vote', methods=['POST'])
+ def process_vote():
+ if g.user is None:
+ abort(401)
+ comment_id = request.form.get('comment_id')
+ value = request.form.get('value')
+ if value is None or comment_id is None:
+ abort(400)
+ support.process_vote(comment_id, g.user.id, value)
+ return "success"
+
+
+Comment Moderation
+~~~~~~~~~~~~~~~~~~
+
+By default, all comments added through :meth:`~.WebSupport.add_comment` are
+automatically displayed. If you wish to have some form of moderation, you can
+pass the `displayed` keyword argument::
+
+ comment = support.add_comment(text, node_id='node_id',
+ parent_id='parent_id',
+ username=username, proposal=proposal,
+ displayed=False)
+
+You can then create a new view to handle the moderation of comments. It
+will be called when a moderator decides a comment should be accepted and
+displayed::
+
+ @app.route('/docs/accept_comment', methods=['POST'])
+ def accept_comment():
+ moderator = g.user.moderator if g.user else False
+ comment_id = request.form.get('id')
+ support.accept_comment(comment_id, moderator=moderator)
+ return 'OK'
+
+Rejecting comments happens via comment deletion.
+
+To perform a custom action (such as emailing a moderator) when a new comment is
+added but not displayed, you can pass callable to the :class:`~.WebSupport`
+class when instantiating your support object::
+
+ def moderation_callback(comment):
+ """Do something..."""
+
+ support = WebSupport(..., moderation_callback=moderation_callback)
+
+The moderation callback must take one argument, which will be the same comment
+dict that is returned by :meth:`add_comment`.
diff --git a/doc/web/searchadapters.rst b/doc/web/searchadapters.rst
new file mode 100644
index 00000000..7d8634f7
--- /dev/null
+++ b/doc/web/searchadapters.rst
@@ -0,0 +1,45 @@
+.. _searchadapters:
+
+.. currentmodule:: sphinx.websupport.search
+
+Search Adapters
+===============
+
+To create a custom search adapter you will need to subclass the
+:class:`BaseSearch` class. Then create an instance of the new class and pass
+that as the `search` keyword argument when you create the :class:`~.WebSupport`
+object::
+
+ support = WebSupport(srcdir=srcdir,
+ builddir=builddir,
+ search=MySearch())
+
+For more information about creating a custom search adapter, please see the
+documentation of the :class:`BaseSearch` class below.
+
+.. class:: BaseSearch
+
+ Defines an interface for search adapters.
+
+
+BaseSearch Methods
+~~~~~~~~~~~~~~~~~~
+
+ The following methods are defined in the BaseSearch class. Some methods do
+ not need to be overridden, but some (:meth:`~BaseSearch.add_document` and
+ :meth:`~BaseSearch.handle_query`) must be overridden in your subclass. For a
+ working example, look at the built-in adapter for whoosh.
+
+.. automethod:: BaseSearch.init_indexing
+
+.. automethod:: BaseSearch.finish_indexing
+
+.. automethod:: BaseSearch.feed
+
+.. automethod:: BaseSearch.add_document
+
+.. automethod:: BaseSearch.query
+
+.. automethod:: BaseSearch.handle_query
+
+.. automethod:: BaseSearch.extract_context
diff --git a/doc/web/storagebackends.rst b/doc/web/storagebackends.rst
new file mode 100644
index 00000000..d191b43e
--- /dev/null
+++ b/doc/web/storagebackends.rst
@@ -0,0 +1,44 @@
+.. _storagebackends:
+
+.. currentmodule:: sphinx.websupport.storage
+
+Storage Backends
+================
+
+To create a custom storage backend you will need to subclass the
+:class:`StorageBackend` class. Then create an instance of the new class and
+pass that as the `storage` keyword argument when you create the
+:class:`~.WebSupport` object::
+
+ support = WebSupport(srcdir=srcdir,
+ builddir=builddir,
+ storage=MyStorage())
+
+For more information about creating a custom storage backend, please see the
+documentation of the :class:`StorageBackend` class below.
+
+.. class:: StorageBackend
+
+ Defines an interface for storage backends.
+
+
+StorageBackend Methods
+~~~~~~~~~~~~~~~~~~~~~~
+
+.. automethod:: StorageBackend.pre_build
+
+.. automethod:: StorageBackend.add_node
+
+.. automethod:: StorageBackend.post_build
+
+.. automethod:: StorageBackend.add_comment
+
+.. automethod:: StorageBackend.delete_comment
+
+.. automethod:: StorageBackend.get_data
+
+.. automethod:: StorageBackend.process_vote
+
+.. automethod:: StorageBackend.update_username
+
+.. automethod:: StorageBackend.accept_comment
diff --git a/doc/websupport.rst b/doc/websupport.rst
new file mode 100644
index 00000000..3ccae246
--- /dev/null
+++ b/doc/websupport.rst
@@ -0,0 +1,16 @@
+.. _websupport:
+
+Sphinx Web Support
+==================
+
+.. versionadded:: 1.1
+
+Sphinx provides a Python API to easily integrate Sphinx documentation into your
+web application. To learn more read the :ref:`websupportquickstart`.
+
+.. toctree::
+
+ web/quickstart
+ web/api
+ web/searchadapters
+ web/storagebackends
diff --git a/ez_setup.py b/ez_setup.py
deleted file mode 100644
index d24e845e..00000000
--- a/ez_setup.py
+++ /dev/null
@@ -1,276 +0,0 @@
-#!python
-"""Bootstrap setuptools installation
-
-If you want to use setuptools in your package's setup.py, just include this
-file in the same directory with it, and add this to the top of your setup.py::
-
- from ez_setup import use_setuptools
- use_setuptools()
-
-If you want to require a specific version of setuptools, set a download
-mirror, or use an alternate download directory, you can do so by supplying
-the appropriate options to ``use_setuptools()``.
-
-This file can also be run as a script to install or upgrade setuptools.
-"""
-import sys
-DEFAULT_VERSION = "0.6c9"
-DEFAULT_URL = "http://pypi.python.org/packages/%s/s/setuptools/" % sys.version[:3]
-
-md5_data = {
- 'setuptools-0.6b1-py2.3.egg': '8822caf901250d848b996b7f25c6e6ca',
- 'setuptools-0.6b1-py2.4.egg': 'b79a8a403e4502fbb85ee3f1941735cb',
- 'setuptools-0.6b2-py2.3.egg': '5657759d8a6d8fc44070a9d07272d99b',
- 'setuptools-0.6b2-py2.4.egg': '4996a8d169d2be661fa32a6e52e4f82a',
- 'setuptools-0.6b3-py2.3.egg': 'bb31c0fc7399a63579975cad9f5a0618',
- 'setuptools-0.6b3-py2.4.egg': '38a8c6b3d6ecd22247f179f7da669fac',
- 'setuptools-0.6b4-py2.3.egg': '62045a24ed4e1ebc77fe039aa4e6f7e5',
- 'setuptools-0.6b4-py2.4.egg': '4cb2a185d228dacffb2d17f103b3b1c4',
- 'setuptools-0.6c1-py2.3.egg': 'b3f2b5539d65cb7f74ad79127f1a908c',
- 'setuptools-0.6c1-py2.4.egg': 'b45adeda0667d2d2ffe14009364f2a4b',
- 'setuptools-0.6c2-py2.3.egg': 'f0064bf6aa2b7d0f3ba0b43f20817c27',
- 'setuptools-0.6c2-py2.4.egg': '616192eec35f47e8ea16cd6a122b7277',
- 'setuptools-0.6c3-py2.3.egg': 'f181fa125dfe85a259c9cd6f1d7b78fa',
- 'setuptools-0.6c3-py2.4.egg': 'e0ed74682c998bfb73bf803a50e7b71e',
- 'setuptools-0.6c3-py2.5.egg': 'abef16fdd61955514841c7c6bd98965e',
- 'setuptools-0.6c4-py2.3.egg': 'b0b9131acab32022bfac7f44c5d7971f',
- 'setuptools-0.6c4-py2.4.egg': '2a1f9656d4fbf3c97bf946c0a124e6e2',
- 'setuptools-0.6c4-py2.5.egg': '8f5a052e32cdb9c72bcf4b5526f28afc',
- 'setuptools-0.6c5-py2.3.egg': 'ee9fd80965da04f2f3e6b3576e9d8167',
- 'setuptools-0.6c5-py2.4.egg': 'afe2adf1c01701ee841761f5bcd8aa64',
- 'setuptools-0.6c5-py2.5.egg': 'a8d3f61494ccaa8714dfed37bccd3d5d',
- 'setuptools-0.6c6-py2.3.egg': '35686b78116a668847237b69d549ec20',
- 'setuptools-0.6c6-py2.4.egg': '3c56af57be3225019260a644430065ab',
- 'setuptools-0.6c6-py2.5.egg': 'b2f8a7520709a5b34f80946de5f02f53',
- 'setuptools-0.6c7-py2.3.egg': '209fdf9adc3a615e5115b725658e13e2',
- 'setuptools-0.6c7-py2.4.egg': '5a8f954807d46a0fb67cf1f26c55a82e',
- 'setuptools-0.6c7-py2.5.egg': '45d2ad28f9750e7434111fde831e8372',
- 'setuptools-0.6c8-py2.3.egg': '50759d29b349db8cfd807ba8303f1902',
- 'setuptools-0.6c8-py2.4.egg': 'cba38d74f7d483c06e9daa6070cce6de',
- 'setuptools-0.6c8-py2.5.egg': '1721747ee329dc150590a58b3e1ac95b',
- 'setuptools-0.6c9-py2.3.egg': 'a83c4020414807b496e4cfbe08507c03',
- 'setuptools-0.6c9-py2.4.egg': '260a2be2e5388d66bdaee06abec6342a',
- 'setuptools-0.6c9-py2.5.egg': 'fe67c3e5a17b12c0e7c541b7ea43a8e6',
- 'setuptools-0.6c9-py2.6.egg': 'ca37b1ff16fa2ede6e19383e7b59245a',
-}
-
-import sys, os
-try: from hashlib import md5
-except ImportError: from md5 import md5
-
-def _validate_md5(egg_name, data):
- if egg_name in md5_data:
- digest = md5(data).hexdigest()
- if digest != md5_data[egg_name]:
- print >>sys.stderr, (
- "md5 validation of %s failed! (Possible download problem?)"
- % egg_name
- )
- sys.exit(2)
- return data
-
-def use_setuptools(
- version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=os.curdir,
- download_delay=15
-):
- """Automatically find/download setuptools and make it available on sys.path
-
- `version` should be a valid setuptools version number that is available
- as an egg for download under the `download_base` URL (which should end with
- a '/'). `to_dir` is the directory where setuptools will be downloaded, if
- it is not already available. If `download_delay` is specified, it should
- be the number of seconds that will be paused before initiating a download,
- should one be required. If an older version of setuptools is installed,
- this routine will print a message to ``sys.stderr`` and raise SystemExit in
- an attempt to abort the calling script.
- """
- was_imported = 'pkg_resources' in sys.modules or 'setuptools' in sys.modules
- def do_download():
- egg = download_setuptools(version, download_base, to_dir, download_delay)
- sys.path.insert(0, egg)
- import setuptools; setuptools.bootstrap_install_from = egg
- try:
- import pkg_resources
- except ImportError:
- return do_download()
- try:
- pkg_resources.require("setuptools>="+version); return
- except pkg_resources.VersionConflict, e:
- if was_imported:
- print >>sys.stderr, (
- "The required version of setuptools (>=%s) is not available, and\n"
- "can't be installed while this script is running. Please install\n"
- " a more recent version first, using 'easy_install -U setuptools'."
- "\n\n(Currently using %r)"
- ) % (version, e.args[0])
- sys.exit(2)
- else:
- del pkg_resources, sys.modules['pkg_resources'] # reload ok
- return do_download()
- except pkg_resources.DistributionNotFound:
- return do_download()
-
-def download_setuptools(
- version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=os.curdir,
- delay = 15
-):
- """Download setuptools from a specified location and return its filename
-
- `version` should be a valid setuptools version number that is available
- as an egg for download under the `download_base` URL (which should end
- with a '/'). `to_dir` is the directory where the egg will be downloaded.
- `delay` is the number of seconds to pause before an actual download attempt.
- """
- import urllib2, shutil
- egg_name = "setuptools-%s-py%s.egg" % (version,sys.version[:3])
- url = download_base + egg_name
- saveto = os.path.join(to_dir, egg_name)
- src = dst = None
- if not os.path.exists(saveto): # Avoid repeated downloads
- try:
- from distutils import log
- if delay:
- log.warn("""
----------------------------------------------------------------------------
-This script requires setuptools version %s to run (even to display
-help). I will attempt to download it for you (from
-%s), but
-you may need to enable firewall access for this script first.
-I will start the download in %d seconds.
-
-(Note: if this machine does not have network access, please obtain the file
-
- %s
-
-and place it in this directory before rerunning this script.)
----------------------------------------------------------------------------""",
- version, download_base, delay, url
- ); from time import sleep; sleep(delay)
- log.warn("Downloading %s", url)
- src = urllib2.urlopen(url)
- # Read/write all in one block, so we don't create a corrupt file
- # if the download is interrupted.
- data = _validate_md5(egg_name, src.read())
- dst = open(saveto,"wb"); dst.write(data)
- finally:
- if src: src.close()
- if dst: dst.close()
- return os.path.realpath(saveto)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-def main(argv, version=DEFAULT_VERSION):
- """Install or upgrade setuptools and EasyInstall"""
- try:
- import setuptools
- except ImportError:
- egg = None
- try:
- egg = download_setuptools(version, delay=0)
- sys.path.insert(0,egg)
- from setuptools.command.easy_install import main
- return main(list(argv)+[egg]) # we're done here
- finally:
- if egg and os.path.exists(egg):
- os.unlink(egg)
- else:
- if setuptools.__version__ == '0.0.1':
- print >>sys.stderr, (
- "You have an obsolete version of setuptools installed. Please\n"
- "remove it from your system entirely before rerunning this script."
- )
- sys.exit(2)
-
- req = "setuptools>="+version
- import pkg_resources
- try:
- pkg_resources.require(req)
- except pkg_resources.VersionConflict:
- try:
- from setuptools.command.easy_install import main
- except ImportError:
- from easy_install import main
- main(list(argv)+[download_setuptools(delay=0)])
- sys.exit(0) # try to force an exit
- else:
- if argv:
- from setuptools.command.easy_install import main
- main(argv)
- else:
- print "Setuptools version",version,"or greater has been installed."
- print '(Run "ez_setup.py -U setuptools" to reinstall or upgrade.)'
-
-def update_md5(filenames):
- """Update our built-in md5 registry"""
-
- import re
-
- for name in filenames:
- base = os.path.basename(name)
- f = open(name,'rb')
- md5_data[base] = md5(f.read()).hexdigest()
- f.close()
-
- data = [" %r: %r,\n" % it for it in md5_data.items()]
- data.sort()
- repl = "".join(data)
-
- import inspect
- srcfile = inspect.getsourcefile(sys.modules[__name__])
- f = open(srcfile, 'rb'); src = f.read(); f.close()
-
- match = re.search("\nmd5_data = {\n([^}]+)}", src)
- if not match:
- print >>sys.stderr, "Internal error!"
- sys.exit(2)
-
- src = src[:match.start(1)] + repl + src[match.end(1):]
- f = open(srcfile,'w')
- f.write(src)
- f.close()
-
-
-if __name__=='__main__':
- if len(sys.argv)>2 and sys.argv[1]=='--md5update':
- update_md5(sys.argv[2:])
- else:
- main(sys.argv[1:])
-
-
-
-
-
-
diff --git a/setup.py b/setup.py
index 183fcceb..87734687 100644
--- a/setup.py
+++ b/setup.py
@@ -2,8 +2,8 @@
try:
from setuptools import setup, find_packages
except ImportError:
- import ez_setup
- ez_setup.use_setuptools()
+ import distribute_setup
+ distribute_setup.use_setuptools()
from setuptools import setup, find_packages
import os
@@ -44,10 +44,10 @@ A development egg can be found `here
<http://bitbucket.org/birkenfeld/sphinx/get/tip.gz#egg=Sphinx-dev>`_.
'''
-requires = ['Pygments>=0.8', 'Jinja2>=2.2', 'docutils>=0.5']
+requires = ['Pygments>=1.2', 'Jinja2>=2.3', 'docutils>=0.7']
if sys.version_info < (2, 4):
- print 'ERROR: Sphinx requires at least Python 2.4 to run.'
+ print('ERROR: Sphinx requires at least Python 2.4 to run.')
sys.exit(1)
if sys.version_info < (2, 5):
@@ -63,6 +63,9 @@ if sys.version_info < (2, 5):
else:
del requires[-1]
+ # The uuid module is new in the stdlib in 2.5
+ requires.append('uuid>=1.30')
+
# Provide a "compile_catalog" command that also creates the translated
# JavaScript files if Babel is available.
@@ -184,12 +187,13 @@ setup(
'Topic :: Utilities',
],
platforms='any',
- packages=find_packages(),
+ packages=find_packages(exclude=['custom_fixers', 'test']),
include_package_data=True,
entry_points={
'console_scripts': [
'sphinx-build = sphinx:main',
'sphinx-quickstart = sphinx.quickstart:main',
+ 'sphinx-apidoc = sphinx.apidoc:main',
'sphinx-autogen = sphinx.ext.autosummary.generate:main',
],
'distutils.commands': [
@@ -198,4 +202,6 @@ setup(
},
install_requires=requires,
cmdclass=cmdclass,
+ use_2to3=True,
+ use_2to3_fixers=['custom_fixers'],
)
diff --git a/sphinx-apidoc.py b/sphinx-apidoc.py
new file mode 100755
index 00000000..9cafb497
--- /dev/null
+++ b/sphinx-apidoc.py
@@ -0,0 +1,15 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+"""
+ Sphinx - Python documentation toolchain
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
+ :license: BSD, see LICENSE for details.
+"""
+
+import sys
+
+if __name__ == '__main__':
+ from sphinx.apidoc import main
+ sys.exit(main(sys.argv))
diff --git a/sphinx/__init__.py b/sphinx/__init__.py
index 6b6af595..468b3406 100644
--- a/sphinx/__init__.py
+++ b/sphinx/__init__.py
@@ -9,11 +9,14 @@
:license: BSD, see LICENSE for details.
"""
+# Keep this file executable as-is in Python 3!
+# (Otherwise getting the version out of it from setup.py is impossible.)
+
import sys
from os import path
-__version__ = '1.0.8+'
-__released__ = '1.0.8' # used when Sphinx builds its own docs
+__version__ = '1.1pre'
+__released__ = '1.1 (hg)' # used when Sphinx builds its own docs
package_dir = path.abspath(path.dirname(__file__))
@@ -34,14 +37,16 @@ if '+' in __version__ or 'pre' in __version__:
def main(argv=sys.argv):
+ """Sphinx build "main" command-line entry."""
if sys.version_info[:3] < (2, 4, 0):
- print >>sys.stderr, \
- 'Error: Sphinx requires at least Python 2.4 to run.'
+ sys.stderr.write('Error: Sphinx requires at least '
+ 'Python 2.4 to run.\n')
return 1
try:
from sphinx import cmdline
- except ImportError, err:
+ except ImportError:
+ err = sys.exc_info()[1]
errstr = str(err)
if errstr.lower().startswith('no module named'):
whichmod = errstr[16:]
@@ -54,14 +59,14 @@ def main(argv=sys.argv):
whichmod = 'roman module (which is distributed with Docutils)'
hint = ('This can happen if you upgraded docutils using\n'
'easy_install without uninstalling the old version'
- 'first.')
+ 'first.\n')
else:
whichmod += ' module'
- print >>sys.stderr, ('Error: The %s cannot be found. '
- 'Did you install Sphinx and its dependencies '
- 'correctly?' % whichmod)
+ sys.stderr.write('Error: The %s cannot be found. '
+ 'Did you install Sphinx and its dependencies '
+ 'correctly?\n' % whichmod)
if hint:
- print >> sys.stderr, hint
+ sys.stderr.write(hint)
return 1
raise
return cmdline.main(argv)
diff --git a/sphinx/addnodes.py b/sphinx/addnodes.py
index 384b51e4..94f1d615 100644
--- a/sphinx/addnodes.py
+++ b/sphinx/addnodes.py
@@ -11,103 +11,171 @@
from docutils import nodes
-# index markup
-class index(nodes.Invisible, nodes.Inline, nodes.TextElement): pass
+
+class toctree(nodes.General, nodes.Element):
+ """Node for inserting a "TOC tree"."""
+
# domain-specific object descriptions (class, function etc.)
-# parent node for signature and content
-class desc(nodes.Admonition, nodes.Element): pass
+class desc(nodes.Admonition, nodes.Element):
+ """Node for object descriptions.
+
+ This node is similar to a "definition list" with one definition. It
+ contains one or more ``desc_signature`` and a ``desc_content``.
+ """
+
+class desc_signature(nodes.Part, nodes.Inline, nodes.TextElement):
+ """Node for object signatures.
-# additional name parts (module name, class name)
-class desc_addname(nodes.Part, nodes.Inline, nodes.TextElement): pass
+ The "term" part of the custom Sphinx definition list.
+ """
+
+
+# nodes to use within a desc_signature
+
+class desc_addname(nodes.Part, nodes.Inline, nodes.TextElement):
+ """Node for additional name parts (module name, class name)."""
# compatibility alias
desc_classname = desc_addname
-# return type (C); object type
-class desc_type(nodes.Part, nodes.Inline, nodes.TextElement): pass
-# -> annotation (Python)
+
+class desc_type(nodes.Part, nodes.Inline, nodes.TextElement):
+ """Node for return types or object type names."""
+
class desc_returns(desc_type):
+ """Node for a "returns" annotation (a la -> in Python)."""
def astext(self):
return ' -> ' + nodes.TextElement.astext(self)
-# main name of object
-class desc_name(nodes.Part, nodes.Inline, nodes.TextElement): pass
-# argument list
-class desc_signature(nodes.Part, nodes.Inline, nodes.TextElement): pass
+
+class desc_name(nodes.Part, nodes.Inline, nodes.TextElement):
+ """Node for the main object name."""
+
class desc_parameterlist(nodes.Part, nodes.Inline, nodes.TextElement):
+ """Node for a general parameter list."""
child_text_separator = ', '
-class desc_parameter(nodes.Part, nodes.Inline, nodes.TextElement): pass
+
+class desc_parameter(nodes.Part, nodes.Inline, nodes.TextElement):
+ """Node for a single parameter."""
+
class desc_optional(nodes.Part, nodes.Inline, nodes.TextElement):
+ """Node for marking optional parts of the parameter list."""
child_text_separator = ', '
def astext(self):
return '[' + nodes.TextElement.astext(self) + ']'
-# annotation (not Python 3-style annotations)
-class desc_annotation(nodes.Part, nodes.Inline, nodes.TextElement): pass
-# node for content
-class desc_content(nodes.General, nodes.Element): pass
+class desc_annotation(nodes.Part, nodes.Inline, nodes.TextElement):
+ """Node for signature annotations (not Python 3-style annotations)."""
+
+class desc_content(nodes.General, nodes.Element):
+ """Node for object description content.
+
+ This is the "definition" part of the custom Sphinx definition list.
+ """
+
+
+# new admonition-like constructs
+
+class versionmodified(nodes.Admonition, nodes.TextElement):
+ """Node for version change entries.
+
+ Currently used for "versionadded", "versionchanged" and "deprecated"
+ directives.
+ """
+
+class seealso(nodes.Admonition, nodes.Element):
+ """Custom "see also" admonition."""
+
+class productionlist(nodes.Admonition, nodes.Element):
+ """Node for grammar production lists.
+
+ Contains ``production`` nodes.
+ """
+
+class production(nodes.Part, nodes.Inline, nodes.TextElement):
+ """Node for a single grammar production rule."""
+
+
+# other directive-level nodes
+
+class index(nodes.Invisible, nodes.Inline, nodes.TextElement):
+ """Node for index entries.
+
+ This node is created by the ``index`` directive and has one attribute,
+ ``entries``. Its value is a list of 4-tuples of ``(entrytype, entryname,
+ target, ignored)``.
+
+ *entrytype* is one of "single", "pair", "double", "triple".
+ """
+
+class centered(nodes.Part, nodes.Element):
+ """Deprecated."""
+
+class acks(nodes.Element):
+ """Special node for "acks" lists."""
+
+class hlist(nodes.Element):
+ """Node for "horizontal lists", i.e. lists that should be compressed to
+ take up less vertical space.
+ """
+
+class hlistcol(nodes.Element):
+ """Node for one column in a horizontal list."""
-# \versionadded, \versionchanged, \deprecated
-class versionmodified(nodes.Admonition, nodes.TextElement): pass
+class compact_paragraph(nodes.paragraph):
+ """Node for a compact paragraph (which never makes a <p> node)."""
-# seealso
-class seealso(nodes.Admonition, nodes.Element): pass
+class glossary(nodes.Element):
+ """Node to insert a glossary."""
-# productionlist
-class productionlist(nodes.Admonition, nodes.Element): pass
-class production(nodes.Part, nodes.Inline, nodes.TextElement): pass
+class only(nodes.Element):
+ """Node for "only" directives (conditional inclusion based on tags)."""
-# toc tree
-class toctree(nodes.General, nodes.Element): pass
-# centered
-class centered(nodes.Part, nodes.Element): pass
+# meta-information nodes
-# pending xref
-class pending_xref(nodes.Inline, nodes.Element): pass
+class start_of_file(nodes.Element):
+ """Node to mark start of a new file, used in the LaTeX builder only."""
-# compact paragraph -- never makes a <p>
-class compact_paragraph(nodes.paragraph): pass
+class highlightlang(nodes.Element):
+ """Inserted to set the highlight language and line number options for
+ subsequent code blocks.
+ """
-# reference to a file to download
-class download_reference(nodes.reference): pass
+class tabular_col_spec(nodes.Element):
+ """Node for specifying tabular columns, used for LaTeX output."""
-# for the ACKS list
-class acks(nodes.Element): pass
+class meta(nodes.Special, nodes.PreBibliographic, nodes.Element):
+ """Node for meta directive -- same as docutils' standard meta node,
+ but pickleable.
+ """
-# for horizontal lists
-class hlist(nodes.Element): pass
-class hlistcol(nodes.Element): pass
-# sets the highlighting language for literal blocks
-class highlightlang(nodes.Element): pass
+# inline nodes
-# like emphasis, but doesn't apply further text processors, e.g. smartypants
-class literal_emphasis(nodes.emphasis): pass
+class pending_xref(nodes.Inline, nodes.Element):
+ """Node for cross-references that cannot be resolved without complete
+ information about all documents.
-# for abbreviations (with explanations)
-class abbreviation(nodes.Inline, nodes.TextElement): pass
+ These nodes are resolved before writing output, in
+ BuildEnvironment.resolve_references.
+ """
-# glossary
-class glossary(nodes.Element): pass
+class download_reference(nodes.reference):
+ """Node for download references, similar to pending_xref."""
-# start of a file, used in the LaTeX builder only
-class start_of_file(nodes.Element): pass
+class literal_emphasis(nodes.emphasis):
+ """Node that behaves like `emphasis`, but further text processors are not
+ applied (e.g. smartypants for HTML output).
+ """
-# tabular column specification, used for the LaTeX writer
-class tabular_col_spec(nodes.Element): pass
+class abbreviation(nodes.Inline, nodes.TextElement):
+ """Node for abbreviations with explanations."""
-# only (in/exclusion based on tags)
-class only(nodes.Element): pass
+class termsep(nodes.Structural, nodes.Element):
+ """Separates two terms within a <term> node."""
-# meta directive -- same as docutils' standard meta node, but pickleable
-class meta(nodes.Special, nodes.PreBibliographic, nodes.Element): pass
-# make them known to docutils. this is needed, because the HTML writer
-# will choke at some point if these are not added
-nodes._add_node_class_names("""index desc desc_content desc_signature
- desc_type desc_returns desc_addname desc_name desc_parameterlist
- desc_parameter desc_optional download_reference hlist hlistcol
- centered versionmodified seealso productionlist production toctree
- pending_xref compact_paragraph highlightlang literal_emphasis
- abbreviation glossary acks module start_of_file tabular_col_spec
- meta""".split())
+# make the new nodes known to docutils; needed because the HTML writer will
+# choke at some point if these are not added
+nodes._add_node_class_names(k for k in globals().keys()
+ if k != 'nodes' and k[0] != '_')
diff --git a/sphinx/apidoc.py b/sphinx/apidoc.py
new file mode 100644
index 00000000..0885dc45
--- /dev/null
+++ b/sphinx/apidoc.py
@@ -0,0 +1,313 @@
+# -*- coding: utf-8 -*-
+"""
+ sphinx.apidoc
+ ~~~~~~~~~~~~~
+
+ Parses a directory tree looking for Python modules and packages and creates
+ ReST files appropriately to create code documentation with Sphinx. It also
+ creates a modules index (named modules.<suffix>).
+
+ This is derived from the "sphinx-autopackage" script, which is:
+ Copyright 2008 Société des arts technologiques (SAT), http://www.sat.qc.ca/.
+
+ :copyright: 2007-2011 by the Sphinx team, see AUTHORS.
+ :license: BSD, see LICENSE for details.
+"""
+import os
+import sys
+import optparse
+from os import path
+
+# automodule options
+OPTIONS = [
+ 'members',
+ 'undoc-members',
+ # 'inherited-members', # disabled because there's a bug in sphinx
+ 'show-inheritance',
+]
+
+INITPY = '__init__.py'
+
+def makename(package, module):
+ """Join package and module with a dot."""
+ # Both package and module can be None/empty.
+ if package:
+ name = package
+ if module:
+ name += '.' + module
+ else:
+ name = module
+ return name
+
+def write_file(name, text, opts):
+ """Write the output file for module/package <name>."""
+ fname = path.join(opts.destdir, '%s.%s' % (name, opts.suffix))
+ if opts.dryrun:
+ print 'Would create file %s.' % fname
+ return
+ if not opts.force and path.isfile(fname):
+ print 'File %s already exists, skipping.' % fname
+ else:
+ print 'Creating file %s.' % fname
+ f = open(fname, 'w')
+ try:
+ f.write(text)
+ finally:
+ f.close()
+
+def format_heading(level, text):
+ """Create a heading of <level> [1, 2 or 3 supported]."""
+ underlining = ['=', '-', '~', ][level-1] * len(text)
+ return '%s\n%s\n\n' % (text, underlining)
+
+def format_directive(module, package=None):
+ """Create the automodule directive and add the options."""
+ directive = '.. automodule:: %s\n' % makename(package, module)
+ for option in OPTIONS:
+ directive += ' :%s:\n' % option
+ return directive
+
+def create_module_file(package, module, opts):
+ """Build the text of the file and write the file."""
+ text = format_heading(1, '%s Module' % module)
+ #text += format_heading(2, ':mod:`%s` Module' % module)
+ text += format_directive(module, package)
+ write_file(makename(package, module), text, opts)
+
+def create_package_file(root, master_package, subroot, py_files, opts, subs):
+ """Build the text of the file and write the file."""
+ package = path.split(root)[-1]
+ text = format_heading(1, '%s Package' % package)
+ # add each module in the package
+ for py_file in py_files:
+ if shall_skip(path.join(root, py_file)):
+ continue
+ is_package = py_file == INITPY
+ py_file = path.splitext(py_file)[0]
+ py_path = makename(subroot, py_file)
+ if is_package:
+ heading = ':mod:`%s` Package' % package
+ else:
+ heading = ':mod:`%s` Module' % py_file
+ text += format_heading(2, heading)
+ text += format_directive(is_package and subroot or py_path,
+ master_package)
+ text += '\n'
+
+ # build a list of directories that are packages (contain an INITPY file)
+ subs = [sub for sub in subs if path.isfile(path.join(root, sub, INITPY))]
+ # if there are some package directories, add a TOC for theses subpackages
+ if subs:
+ text += format_heading(2, 'Subpackages')
+ text += '.. toctree::\n\n'
+ for sub in subs:
+ text += ' %s.%s\n' % (makename(master_package, subroot), sub)
+ text += '\n'
+
+ write_file(makename(master_package, subroot), text, opts)
+
+def create_modules_toc_file(modules, opts, name='modules'):
+ """
+ Create the module's index.
+ """
+ text = format_heading(1, '%s' % opts.header)
+ text += '.. toctree::\n'
+ text += ' :maxdepth: %s\n\n' % opts.maxdepth
+
+ modules.sort()
+ prev_module = ''
+ for module in modules:
+ # look if the module is a subpackage and, if yes, ignore it
+ if module.startswith(prev_module + '.'):
+ continue
+ prev_module = module
+ text += ' %s\n' % module
+
+ write_file(name, text, opts)
+
+def shall_skip(module):
+ """
+ Check if we want to skip this module.
+ """
+ # skip it, if there is nothing (or just \n or \r\n) in the file
+ return path.getsize(module) < 3
+
+def recurse_tree(rootpath, excludes, opts):
+ """
+ Look for every file in the directory tree and create the corresponding
+ ReST files.
+ """
+ # use absolute path for root, as relative paths like '../../foo' cause
+ # 'if "/." in root ...' to filter out *all* modules otherwise
+ rootpath = os.path.abspath(rootpath)
+ # check if the base directory is a package and get is name
+ if INITPY in os.listdir(rootpath):
+ package_name = rootpath.split(path.sep)[-1]
+ else:
+ package_name = None
+
+ toc = []
+ tree = os.walk(rootpath, False)
+ for root, subs, files in tree:
+ # keep only the Python script files
+ py_files = sorted([f for f in files if path.splitext(f)[1] == '.py'])
+ if INITPY in py_files:
+ py_files.remove(INITPY)
+ py_files.insert(0, INITPY)
+ # remove hidden ('.') and private ('_') directories
+ subs = sorted([sub for sub in subs if sub[0] not in ['.', '_']])
+ # check if there are valid files to process
+ # TODO: could add check for windows hidden files
+ if "/." in root or "/_" in root \
+ or not py_files \
+ or is_excluded(root, excludes):
+ continue
+ if INITPY in py_files:
+ # we are in package ...
+ if (# ... with subpackage(s)
+ subs
+ or
+ # ... with some module(s)
+ len(py_files) > 1
+ or
+ # ... with a not-to-be-skipped INITPY file
+ not shall_skip(path.join(root, INITPY))
+ ):
+ subroot = root[len(rootpath):].lstrip(path.sep).\
+ replace(path.sep, '.')
+ create_package_file(root, package_name, subroot,
+ py_files, opts, subs)
+ toc.append(makename(package_name, subroot))
+ elif root == rootpath:
+ # if we are at the root level, we don't require it to be a package
+ for py_file in py_files:
+ if not shall_skip(path.join(rootpath, py_file)):
+ module = path.splitext(py_file)[0]
+ create_module_file(package_name, module, opts)
+ toc.append(makename(package_name, module))
+
+ return toc
+
+
+def normalize_excludes(rootpath, excludes):
+ """
+ Normalize the excluded directory list:
+ * must be either an absolute path or start with rootpath,
+ * otherwise it is joined with rootpath
+ * with trailing slash
+ """
+ sep = path.sep
+ f_excludes = []
+ for exclude in excludes:
+ if not path.isabs(exclude) and not exclude.startswith(rootpath):
+ exclude = path.join(rootpath, exclude)
+ if not exclude.endswith(sep):
+ exclude += sep
+ f_excludes.append(exclude)
+ return f_excludes
+
+def is_excluded(root, excludes):
+ """
+ Check if the directory is in the exclude list.
+
+ Note: by having trailing slashes, we avoid common prefix issues, like
+ e.g. an exlude "foo" also accidentally excluding "foobar".
+ """
+ sep = path.sep
+ if not root.endswith(sep):
+ root += sep
+ for exclude in excludes:
+ if root.startswith(exclude):
+ return True
+ return False
+
+def main(argv=sys.argv):
+ """
+ Parse and check the command line arguments.
+ """
+ parser = optparse.OptionParser(
+ usage="""\
+usage: %prog [options] -o <output_path> <module_path> [exclude_paths, ...]
+
+Look recursively in <module_path> for Python modules and packages and create
+one reST file with automodule directives per package in the <output_path>.
+
+Note: By default this script will not overwrite already created files.""")
+
+ parser.add_option('-o', '--output-dir', action='store', dest='destdir',
+ help='Directory to place all output', default='')
+ parser.add_option('-d', '--maxdepth', action='store', dest='maxdepth',
+ help='Maximum depth of submodules to show in the TOC '
+ '(default: 4)', type='int', default=4)
+ parser.add_option('-f', '--force', action='store_true', dest='force',
+ help='Overwrite all files')
+ parser.add_option('-n', '--dry-run', action='store_true', dest='dryrun',
+ help='Run the script without creating files')
+ parser.add_option('-T', '--no-toc', action='store_true', dest='notoc',
+ help='Don\'t create a table of contents file')
+ parser.add_option('-s', '--suffix', action='store', dest='suffix',
+ help='file suffix (default: rst)', default='rst')
+ parser.add_option('-F', '--full', action='store_true', dest='full',
+ help='Generate a full project with sphinx-quickstart')
+ parser.add_option('-H', '--doc-project', action='store', dest='header',
+ help='Project name (default: root module name)')
+ parser.add_option('-A', '--doc-author', action='store', dest='author', type='str',
+ help='Project author(s), used when --full is given')
+ parser.add_option('-V', '--doc-version', action='store', dest='version',
+ help='Project version, used when --full is given')
+ parser.add_option('-R', '--doc-release', action='store', dest='release',
+ help='Project release, used when --full is given, '
+ 'defaults to --doc-version')
+
+ (opts, args) = parser.parse_args(argv[1:])
+
+ if not args:
+ parser.error('A package path is required.')
+
+ rootpath, excludes = args[0], args[1:]
+ if not opts.destdir:
+ parser.error('An output directory is required.')
+ if opts.header is None:
+ opts.header = rootpath
+ if opts.suffix.startswith('.'):
+ opts.suffix = opts.suffix[1:]
+ if not path.isdir(rootpath):
+ print >>sys.stderr, '%s is not a directory.' % rootpath
+ sys.exit(1)
+ if not path.isdir(opts.destdir):
+ if not opts.dryrun:
+ os.makedirs(opts.destdir)
+ excludes = normalize_excludes(rootpath, excludes)
+ modules = recurse_tree(rootpath, excludes, opts)
+ if opts.full:
+ from sphinx import quickstart as qs
+ modules.sort()
+ prev_module = ''
+ text = ''
+ for module in modules:
+ if module.startswith(prev_module + '.'):
+ continue
+ prev_module = module
+ text += ' %s\n' % module
+ d = dict(
+ path = opts.destdir,
+ sep = False,
+ dot = '_',
+ project = opts.header,
+ author = opts.author or 'Author',
+ version = opts.version or '',
+ release = opts.release or opts.version or '',
+ suffix = '.' + opts.suffix,
+ master = 'index',
+ epub = True,
+ ext_autodoc = True,
+ ext_viewcode = True,
+ makefile = True,
+ batchfile = True,
+ mastertocmaxdepth = opts.maxdepth,
+ mastertoctree = text,
+ )
+ if not opts.dryrun:
+ qs.generate(d, silent=True, overwrite=opts.force)
+ elif not opts.notoc:
+ create_modules_toc_file(modules, opts)
diff --git a/sphinx/application.py b/sphinx/application.py
index 3f03ffa7..dec9c13c 100644
--- a/sphinx/application.py
+++ b/sphinx/application.py
@@ -37,12 +37,10 @@ from sphinx.util.osutil import ENOENT
from sphinx.util.console import bold
-# Directive is either new-style or old-style
-clstypes = (type, types.ClassType)
-
# List of all known core events. Maps name to arguments description.
events = {
'builder-inited': '',
+ 'env-get-outdated': 'env, added, changed, removed',
'env-purge-doc': 'env, docname',
'source-read': 'docname, source text',
'doctree-read': 'the doctree before being pickled',
@@ -136,9 +134,8 @@ class Sphinx(object):
self._init_builder(buildername)
def _init_i18n(self):
- """
- Load translated strings from the configured localedirs if
- enabled in the configuration.
+ """Load translated strings from the configured localedirs if enabled in
+ the configuration.
"""
if self.config.language is not None:
self.info(bold('loading translations [%s]... ' %
@@ -368,6 +365,9 @@ class Sphinx(object):
elif key == 'man':
from sphinx.writers.manpage import ManualPageTranslator \
as translator
+ elif key == 'texinfo':
+ from sphinx.writers.texinfo import TexinfoTranslator \
+ as translator
else:
# ignore invalid keys for compatibility
continue
@@ -472,8 +472,11 @@ class Sphinx(object):
def add_stylesheet(self, filename):
from sphinx.builders.html import StandaloneHTMLBuilder
- StandaloneHTMLBuilder.css_files.append(
- posixpath.join('_static', filename))
+ if '://' in filename:
+ StandaloneHTMLBuilder.css_files.append(filename)
+ else:
+ StandaloneHTMLBuilder.css_files.append(
+ posixpath.join('_static', filename))
def add_lexer(self, alias, lexer):
from sphinx.highlighting import lexers
@@ -490,6 +493,11 @@ class Sphinx(object):
from sphinx.ext import autodoc
autodoc.AutoDirective._special_attrgetters[type] = getter
+ def add_search_language(self, cls):
+ from sphinx.search import languages, SearchLanguage
+ assert isinstance(cls, SearchLanguage)
+ languages[cls.lang] = cls
+
class TemplateBridge(object):
"""
@@ -498,8 +506,7 @@ class TemplateBridge(object):
"""
def init(self, builder, theme=None, dirs=None):
- """
- Called by the builder to initialize the template system.
+ """Called by the builder to initialize the template system.
*builder* is the builder object; you'll probably want to look at the
value of ``builder.config.templates_path``.
@@ -510,23 +517,20 @@ class TemplateBridge(object):
raise NotImplementedError('must be implemented in subclasses')
def newest_template_mtime(self):
- """
- Called by the builder to determine if output files are outdated
+ """Called by the builder to determine if output files are outdated
because of template changes. Return the mtime of the newest template
file that was changed. The default implementation returns ``0``.
"""
return 0
def render(self, template, context):
- """
- Called by the builder to render a template given as a filename with a
- specified context (a Python dictionary).
+ """Called by the builder to render a template given as a filename with
+ a specified context (a Python dictionary).
"""
raise NotImplementedError('must be implemented in subclasses')
def render_string(self, template, context):
- """
- Called by the builder to render a template given as a string with a
+ """Called by the builder to render a template given as a string with a
specified context (a Python dictionary).
"""
raise NotImplementedError('must be implemented in subclasses')
diff --git a/sphinx/builders/__init__.py b/sphinx/builders/__init__.py
index 32db8659..5240a1c7 100644
--- a/sphinx/builders/__init__.py
+++ b/sphinx/builders/__init__.py
@@ -31,9 +31,12 @@ class Builder(object):
name = ''
# builder's output format, or '' if no document output is produced
format = ''
+ # doctree versioning method
+ versioning_method = 'none'
def __init__(self, app):
self.env = app.env
+ self.env.set_versioning_method(self.versioning_method)
self.srcdir = app.srcdir
self.confdir = app.confdir
self.outdir = app.outdir
@@ -55,16 +58,13 @@ class Builder(object):
# helper methods
def init(self):
- """
- Load necessary templates and perform initialization. The default
+ """Load necessary templates and perform initialization. The default
implementation does nothing.
"""
pass
def create_template_bridge(self):
- """
- Return the template bridge configured.
- """
+ """Return the template bridge configured."""
if self.config.template_bridge:
self.templates = self.app.import_object(
self.config.template_bridge, 'template_bridge setting')()
@@ -73,23 +73,23 @@ class Builder(object):
self.templates = BuiltinTemplateLoader()
def get_target_uri(self, docname, typ=None):
- """
- Return the target URI for a document name (*typ* can be used to qualify
- the link characteristic for individual builders).
+ """Return the target URI for a document name.
+
+ *typ* can be used to qualify the link characteristic for individual
+ builders.
"""
raise NotImplementedError
def get_relative_uri(self, from_, to, typ=None):
- """
- Return a relative URI between two source filenames. May raise
- environment.NoUri if there's no way to return a sensible URI.
+ """Return a relative URI between two source filenames.
+
+ May raise environment.NoUri if there's no way to return a sensible URI.
"""
return relative_uri(self.get_target_uri(from_),
self.get_target_uri(to, typ))
def get_outdated_docs(self):
- """
- Return an iterable of output files that are outdated, or a string
+ """Return an iterable of output files that are outdated, or a string
describing what an update build will build.
If the builder does not output individual files corresponding to
@@ -129,9 +129,7 @@ class Builder(object):
supported_image_types = []
def post_process_images(self, doctree):
- """
- Pick the best candidate for all image URIs.
- """
+ """Pick the best candidate for all image URIs."""
for node in doctree.traverse(nodes.image):
if '?' in node['candidates']:
# don't rewrite nonlocal image URIs
@@ -198,9 +196,9 @@ class Builder(object):
'out of date' % len(to_build))
def build(self, docnames, summary=None, method='update'):
- """
- Main build method. First updates the environment, and then
- calls :meth:`write`.
+ """Main build method.
+
+ First updates the environment, and then calls :meth:`write`.
"""
if summary:
self.info(bold('building [%s]: ' % self.name), nonl=1)
@@ -303,15 +301,18 @@ class Builder(object):
raise NotImplementedError
def finish(self):
- """
- Finish the building process. The default implementation does nothing.
+ """Finish the building process.
+
+ The default implementation does nothing.
"""
pass
def cleanup(self):
+ """Cleanup any resources.
+
+ The default implementation does nothing.
"""
- Cleanup any resources. The default implementation does nothing.
- """
+ pass
BUILTIN_BUILDERS = {
@@ -328,6 +329,9 @@ BUILTIN_BUILDERS = {
'latex': ('latex', 'LaTeXBuilder'),
'text': ('text', 'TextBuilder'),
'man': ('manpage', 'ManualPageBuilder'),
+ 'texinfo': ('texinfo', 'TexinfoBuilder'),
'changes': ('changes', 'ChangesBuilder'),
'linkcheck': ('linkcheck', 'CheckExternalLinksBuilder'),
+ 'websupport': ('websupport', 'WebSupportBuilder'),
+ 'gettext': ('gettext', 'MessageCatalogBuilder'),
}
diff --git a/sphinx/builders/changes.py b/sphinx/builders/changes.py
index 6c19fd30..3e351e6c 100644
--- a/sphinx/builders/changes.py
+++ b/sphinx/builders/changes.py
@@ -30,7 +30,8 @@ class ChangesBuilder(Builder):
def init(self):
self.create_template_bridge()
- Theme.init_themes(self)
+ Theme.init_themes(self.confdir, self.config.html_theme_path,
+ warn=self.warn)
self.theme = Theme('default')
self.templates.init(self, self.theme)
diff --git a/sphinx/builders/devhelp.py b/sphinx/builders/devhelp.py
index fca1602e..a1b41945 100644
--- a/sphinx/builders/devhelp.py
+++ b/sphinx/builders/devhelp.py
@@ -42,7 +42,6 @@ except ImportError:
class DevhelpBuilder(StandaloneHTMLBuilder):
"""
Builder that also outputs GNOME Devhelp file.
-
"""
name = 'devhelp'
diff --git a/sphinx/builders/epub.py b/sphinx/builders/epub.py
index a356254b..e946e0d3 100644
--- a/sphinx/builders/epub.py
+++ b/sphinx/builders/epub.py
@@ -12,6 +12,7 @@
import os
import re
+import sys
import time
import codecs
import zipfile
@@ -97,6 +98,12 @@ _content_template = u'''\
</package>
'''
+_cover_template = u'''\
+ <meta name="cover" content="%(cover)s"/>
+'''
+
+_coverpage_name = u'epub-cover.html'
+
_file_template = u'''\
<item id="%(id)s"
href="%(href)s"
@@ -132,7 +139,8 @@ _refuri_re = re.compile("([^#:]*#)(.*)")
# The epub publisher
class EpubBuilder(StandaloneHTMLBuilder):
- """Builder that outputs epub files.
+ """
+ Builder that outputs epub files.
It creates the metainfo files container.opf, toc.ncx, mimetype, and
META-INF/container.xml. Afterwards, all necessary files are zipped to an
@@ -234,6 +242,7 @@ class EpubBuilder(StandaloneHTMLBuilder):
def fix_ids(self, tree):
"""Replace colons with hyphens in href and id attributes.
+
Some readers crash because they interpret the part as a
transport protocol specification.
"""
@@ -252,8 +261,7 @@ class EpubBuilder(StandaloneHTMLBuilder):
node.attributes['ids'] = newids
def add_visible_links(self, tree):
- """Append visible link targets after external links.
- """
+ """Append visible link targets after external links."""
for node in tree.traverse(nodes.reference):
uri = node.get('refuri', '')
if (uri.startswith('http:') or uri.startswith('https:') or
@@ -267,6 +275,7 @@ class EpubBuilder(StandaloneHTMLBuilder):
def write_doc(self, docname, doctree):
"""Write one document file.
+
This method is overwritten in order to fix fragment identifiers
and to add visible external links.
"""
@@ -275,28 +284,29 @@ class EpubBuilder(StandaloneHTMLBuilder):
return StandaloneHTMLBuilder.write_doc(self, docname, doctree)
def fix_genindex(self, tree):
- """Fix href attributes for genindex pages.
- """
+ """Fix href attributes for genindex pages."""
# XXX: modifies tree inline
# Logic modeled from themes/basic/genindex.html
for key, columns in tree:
for entryname, (links, subitems) in columns:
- for (i, link) in enumerate(links):
+ for (i, (ismain, link)) in enumerate(links):
m = _refuri_re.match(link)
if m:
- links[i] = self.fix_fragment(m.group(1), m.group(2))
+ links[i] = (ismain,
+ self.fix_fragment(m.group(1), m.group(2)))
for subentryname, subentrylinks in subitems:
- for (i, link) in enumerate(subentrylinks):
+ for (i, (ismain, link)) in enumerate(subentrylinks):
m = _refuri_re.match(link)
if m:
- subentrylinks[i] = \
- self.fix_fragment(m.group(1), m.group(2))
+ subentrylinks[i] = (ismain,
+ self.fix_fragment(m.group(1), m.group(2)))
def handle_page(self, pagename, addctx, templatename='page.html',
outfilename=None, event_arg=None):
"""Create a rendered page.
- This method is overwritten for genindex pages in order to fix
- href link attributes.
+
+ This method is overwritten for genindex pages in order to fix href link
+ attributes.
"""
if pagename.startswith('genindex'):
self.fix_genindex(addctx['genindexentries'])
@@ -387,7 +397,6 @@ class EpubBuilder(StandaloneHTMLBuilder):
'media_type': self.esc(_media_types[ext])
})
self.files.append(filename)
- projectfiles = '\n'.join(projectfiles)
# spine
spine = []
@@ -407,12 +416,38 @@ class EpubBuilder(StandaloneHTMLBuilder):
spine.append(_spine_template % {
'idref': self.esc(self.make_id('genindex' + self.out_suffix))
})
+
+ # add the optional cover
+ content_tmpl = _content_template
+ if self.config.epub_cover:
+ image, tmpl = self.config.epub_cover
+ mpos = content_tmpl.rfind('</metadata>')
+ cpos = content_tmpl.rfind('\n', 0 , mpos) + 1
+ content_tmpl = content_tmpl[:cpos] + \
+ _cover_template % {'cover': self.esc(self.make_id(image))} + \
+ content_tmpl[cpos:]
+ if tmpl:
+ spine.insert(0, _spine_template % {
+ 'idref': self.esc(self.make_id(_coverpage_name))})
+ if _coverpage_name not in self.files:
+ ext = path.splitext(_coverpage_name)[-1]
+ self.files.append(_coverpage_name)
+ projectfiles.append(_file_template % {
+ 'href': self.esc(_coverpage_name),
+ 'id': self.esc(self.make_id(_coverpage_name)),
+ 'media_type': self.esc(_media_types[ext])
+ })
+ ctx = {'image': self.esc(image), 'title': self.config.project}
+ self.handle_page(
+ os.path.splitext(_coverpage_name)[0], ctx, tmpl)
+
+ projectfiles = '\n'.join(projectfiles)
spine = '\n'.join(spine)
# write the project file
f = codecs.open(path.join(outdir, outname), 'w', 'utf-8')
try:
- f.write(_content_template % \
+ f.write(content_tmpl % \
self.content_metadata(projectfiles, spine))
finally:
f.close()
@@ -429,6 +464,7 @@ class EpubBuilder(StandaloneHTMLBuilder):
def insert_subnav(self, node, subnav):
"""Insert nested navpoints for given node.
+
The node and subnav are already rendered to text.
"""
nlist = node.rsplit('\n', 1)
@@ -438,8 +474,8 @@ class EpubBuilder(StandaloneHTMLBuilder):
def build_navpoints(self, nodes):
"""Create the toc navigation structure.
- Subelements of a node are nested inside the navpoint.
- For nested nodes the parent node is reinserted in the subnav.
+ Subelements of a node are nested inside the navpoint. For nested nodes
+ the parent node is reinserted in the subnav.
"""
navstack = []
navlist = []
@@ -479,8 +515,8 @@ class EpubBuilder(StandaloneHTMLBuilder):
return '\n'.join(navlist)
def toc_metadata(self, level, navpoints):
- """Create a dictionary with all metadata for the toc.ncx
- file properly escaped.
+ """Create a dictionary with all metadata for the toc.ncx file
+ properly escaped.
"""
metadata = {}
metadata['uid'] = self.config.epub_uid
@@ -505,8 +541,8 @@ class EpubBuilder(StandaloneHTMLBuilder):
def build_epub(self, outdir, outname):
"""Write the epub file.
- It is a zip file with the mimetype file stored uncompressed
- as the first entry.
+ It is a zip file with the mimetype file stored uncompressed as the first
+ entry.
"""
self.info('writing %s file...' % outname)
projectfiles = ['META-INF/container.xml', 'content.opf', 'toc.ncx'] \
@@ -516,7 +552,8 @@ class EpubBuilder(StandaloneHTMLBuilder):
epub.write(path.join(outdir, 'mimetype'), 'mimetype', \
zipfile.ZIP_STORED)
for file in projectfiles:
- if isinstance(file, unicode):
- file = file.encode('utf-8')
- epub.write(path.join(outdir, file), file, zipfile.ZIP_DEFLATED)
+ fp = path.join(outdir, file)
+ if isinstance(fp, unicode):
+ fp = fp.encode(sys.getfilesystemencoding())
+ epub.write(fp, file, zipfile.ZIP_DEFLATED)
epub.close()
diff --git a/sphinx/builders/gettext.py b/sphinx/builders/gettext.py
new file mode 100644
index 00000000..b64c917c
--- /dev/null
+++ b/sphinx/builders/gettext.py
@@ -0,0 +1,130 @@
+# -*- coding: utf-8 -*-
+"""
+ sphinx.builders.gettext
+ ~~~~~~~~~~~~~~~~~~~~~~~
+
+ The MessageCatalogBuilder class.
+
+ :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
+ :license: BSD, see LICENSE for details.
+"""
+
+from os import path
+from codecs import open
+from datetime import datetime
+from collections import defaultdict
+
+from sphinx.builders import Builder
+from sphinx.util.nodes import extract_messages
+from sphinx.util.osutil import SEP, safe_relpath, ensuredir, find_catalog
+from sphinx.util.console import darkgreen
+
+POHEADER = ur"""
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) %(copyright)s
+# This file is distributed under the same license as the %(project)s package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: %(version)s\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: %(ctime)s\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+"""[1:]
+
+
+class Catalog(object):
+ """Catalog of translatable messages."""
+
+ def __init__(self):
+ self.messages = [] # retain insertion order, a la OrderedDict
+ self.metadata = {} # msgid -> file, line, uid
+
+ def add(self, msg, origin):
+ if msg not in self.metadata: # faster lookup in hash
+ self.messages.append(msg)
+ self.metadata[msg] = []
+ self.metadata[msg].append((origin.source, origin.line, origin.uid))
+
+
+class I18nBuilder(Builder):
+ """
+ General i18n builder.
+ """
+ name = 'i18n'
+ versioning_method = 'text'
+
+ def init(self):
+ Builder.init(self)
+ self.catalogs = defaultdict(Catalog)
+
+ def get_target_uri(self, docname, typ=None):
+ return ''
+
+ def get_outdated_docs(self):
+ return self.env.found_docs
+
+ def prepare_writing(self, docnames):
+ return
+
+ def write_doc(self, docname, doctree):
+ catalog = self.catalogs[find_catalog(docname,
+ self.config.gettext_compact)]
+
+ for node, msg in extract_messages(doctree):
+ catalog.add(msg, node)
+
+
+class MessageCatalogBuilder(I18nBuilder):
+ """
+ Builds gettext-style message catalogs (.pot files).
+ """
+ name = 'gettext'
+
+ def finish(self):
+ I18nBuilder.finish(self)
+ data = dict(
+ version = self.config.version,
+ copyright = self.config.copyright,
+ project = self.config.project,
+ # XXX should supply tz
+ ctime = datetime.now().strftime('%Y-%m-%d %H:%M%z'),
+ )
+ for textdomain, catalog in self.status_iterator(
+ self.catalogs.iteritems(), "writing message catalogs... ",
+ lambda (textdomain, _):darkgreen(textdomain), len(self.catalogs)):
+
+ # noop if config.gettext_compact is set
+ ensuredir(path.join(self.outdir, path.dirname(textdomain)))
+
+ pofn = path.join(self.outdir, textdomain + '.pot')
+ pofile = open(pofn, 'w', encoding='utf-8')
+ try:
+ pofile.write(POHEADER % data)
+
+ for message in catalog.messages:
+ positions = catalog.metadata[message]
+
+ # generate "#: file1:line1\n#: file2:line2 ..."
+ pofile.write(u"#: %s\n" % "\n#: ".join("%s:%s" %
+ (safe_relpath(source, self.outdir), line)
+ for source, line, _ in positions))
+ # generate "# uuid1\n# uuid2\n ..."
+ pofile.write(u"# %s\n" % "\n# ".join(uid for _, _, uid
+ in positions))
+
+ # message contains *one* line of text ready for translation
+ message = message.replace(u'\\', ur'\\'). \
+ replace(u'"', ur'\"')
+ pofile.write(u'msgid "%s"\nmsgstr ""\n\n' % message)
+
+ finally:
+ pofile.close()
diff --git a/sphinx/builders/html.py b/sphinx/builders/html.py
index ca3d6161..e9099542 100644
--- a/sphinx/builders/html.py
+++ b/sphinx/builders/html.py
@@ -35,7 +35,7 @@ from sphinx.util.osutil import SEP, os_path, relative_uri, ensuredir, \
movefile, ustrftime, copyfile
from sphinx.util.nodes import inline_all_toctrees
from sphinx.util.matching import patmatch, compile_matchers
-from sphinx.util.pycompat import any
+from sphinx.util.pycompat import any, b
from sphinx.errors import SphinxError
from sphinx.locale import _
from sphinx.search import js_index
@@ -63,6 +63,7 @@ class StandaloneHTMLBuilder(Builder):
out_suffix = '.html'
link_suffix = '.html' # defaults to matching out_suffix
indexer_format = js_index
+ indexer_dumps_unicode = True
supported_image_types = ['image/svg+xml', 'image/png',
'image/gif', 'image/jpeg']
searchindex_filename = 'searchindex.js'
@@ -122,7 +123,8 @@ class StandaloneHTMLBuilder(Builder):
return self.config.html_theme, self.config.html_theme_options
def init_templates(self):
- Theme.init_themes(self)
+ Theme.init_themes(self.confdir, self.config.html_theme_path,
+ warn=self.warn)
themename, themeoptions = self.get_theme_config()
self.theme = Theme(themename)
self.theme_options = themeoptions.copy()
@@ -154,8 +156,9 @@ class StandaloneHTMLBuilder(Builder):
cfgdict = dict((name, self.config[name])
for (name, desc) in self.config.values.iteritems()
if desc[1] == 'html')
- self.config_hash = md5(str(cfgdict)).hexdigest()
- self.tags_hash = md5(str(sorted(self.tags))).hexdigest()
+ self.config_hash = md5(unicode(cfgdict).encode('utf-8')).hexdigest()
+ self.tags_hash = md5(unicode(sorted(self.tags)).encode('utf-8')) \
+ .hexdigest()
old_config_hash = old_tags_hash = ''
try:
fp = open(path.join(self.outdir, '.buildinfo'))
@@ -209,7 +212,7 @@ class StandaloneHTMLBuilder(Builder):
"""Utility: Render a lone doctree node."""
if node is None:
return {'fragment': ''}
- doc = new_document('<partial node>')
+ doc = new_document(b('<partial node>'))
doc.append(node)
if self._publisher is None:
@@ -231,10 +234,15 @@ class StandaloneHTMLBuilder(Builder):
return pub.writer.parts
def prepare_writing(self, docnames):
- from sphinx.search import IndexBuilder
-
- self.indexer = IndexBuilder(self.env)
+ # create the search indexer
+ from sphinx.search import IndexBuilder, languages
+ lang = self.config.html_search_language or self.config.language
+ if not lang or lang not in languages:
+ lang = 'en'
+ self.indexer = IndexBuilder(self.env, lang,
+ self.config.html_search_options)
self.load_indexer(docnames)
+
self.docwriter = HTMLWriter(self)
self.docsettings = OptionParser(
defaults=self.env.settings,
@@ -381,7 +389,8 @@ class StandaloneHTMLBuilder(Builder):
meta = self.env.metadata.get(docname)
# local TOC and global TOC tree
- toc = self.render_partial(self.env.get_toc_for(docname))['fragment']
+ self_toc = self.env.get_toc_for(docname, self)
+ toc = self.render_partial(self_toc)['fragment']
return dict(
parents = parents,
@@ -538,13 +547,18 @@ class StandaloneHTMLBuilder(Builder):
if jsfile:
copyfile(jsfile, path.join(self.outdir, '_static',
'translations.js'))
+
+ # add context items for search function used in searchtools.js_t
+ ctx = self.globalcontext.copy()
+ ctx.update(self.indexer.context_for_searchtool())
+
# then, copy over theme-supplied static files
if self.theme:
themeentries = [path.join(themepath, 'static')
for themepath in self.theme.get_dirchain()[::-1]]
for entry in themeentries:
copy_static_entry(entry, path.join(self.outdir, '_static'),
- self, self.globalcontext)
+ self, ctx)
# then, copy over all user-supplied static files
staticentries = [path.join(self.confdir, spath)
for spath in self.config.html_static_path]
@@ -557,7 +571,7 @@ class StandaloneHTMLBuilder(Builder):
self.warn('html_static_path entry %r does not exist' % entry)
continue
copy_static_entry(entry, path.join(self.outdir, '_static'), self,
- self.globalcontext, exclude_matchers=matchers)
+ ctx, exclude_matchers=matchers)
# copy logo and favicon files if not already in static path
if self.config.html_logo:
logobase = path.basename(self.config.html_logo)
@@ -591,8 +605,7 @@ class StandaloneHTMLBuilder(Builder):
self.theme.cleanup()
def post_process_images(self, doctree):
- """
- Pick the best candidate for an image and link down-scaled images to
+ """Pick the best candidate for an image and link down-scaled images to
their high res version.
"""
Builder.post_process_images(self, doctree)
@@ -616,7 +629,11 @@ class StandaloneHTMLBuilder(Builder):
def load_indexer(self, docnames):
keep = set(self.env.all_docs) - set(docnames)
try:
- f = open(path.join(self.outdir, self.searchindex_filename), 'rb')
+ searchindexfn = path.join(self.outdir, self.searchindex_filename)
+ if self.indexer_dumps_unicode:
+ f = codecs.open(searchindexfn, 'r', encoding='utf-8')
+ else:
+ f = open(searchindexfn, 'rb')
try:
self.indexer.load(f, self.indexer_format)
finally:
@@ -739,10 +756,12 @@ class StandaloneHTMLBuilder(Builder):
self.info(bold('dumping object inventory... '), nonl=True)
f = open(path.join(self.outdir, INVENTORY_FILENAME), 'wb')
try:
- f.write('# Sphinx inventory version 2\n')
- f.write('# Project: %s\n' % self.config.project.encode('utf-8'))
- f.write('# Version: %s\n' % self.config.version.encode('utf-8'))
- f.write('# The remainder of this file is compressed using zlib.\n')
+ f.write((u'# Sphinx inventory version 2\n'
+ u'# Project: %s\n'
+ u'# Version: %s\n'
+ u'# The remainder of this file is compressed using zlib.\n'
+ % (self.config.project, self.config.version)
+ ).encode('utf-8'))
compressor = zlib.compressobj(9)
for domainname, domain in self.env.domains.iteritems():
for name, dispname, type, docname, anchor, prio in \
@@ -754,11 +773,9 @@ class StandaloneHTMLBuilder(Builder):
if dispname == name:
dispname = u'-'
f.write(compressor.compress(
- '%s %s:%s %s %s %s\n' % (name.encode('utf-8'),
- domainname.encode('utf-8'),
- type.encode('utf-8'), prio,
- uri.encode('utf-8'),
- dispname.encode('utf-8'))))
+ (u'%s %s:%s %s %s %s\n' % (name, domainname, type,
+ prio, uri, dispname)
+ ).encode('utf-8')))
f.write(compressor.flush())
finally:
f.close()
@@ -770,7 +787,10 @@ class StandaloneHTMLBuilder(Builder):
searchindexfn = path.join(self.outdir, self.searchindex_filename)
# first write to a temporary file, so that if dumping fails,
# the existing index won't be overwritten
- f = open(searchindexfn + '.tmp', 'wb')
+ if self.indexer_dumps_unicode:
+ f = codecs.open(searchindexfn + '.tmp', 'w', encoding='utf-8')
+ else:
+ f = open(searchindexfn + '.tmp', 'wb')
try:
self.indexer.dump(f, self.indexer_format)
finally:
@@ -927,6 +947,9 @@ class SerializingHTMLBuilder(StandaloneHTMLBuilder):
#: implements a `dump`, `load`, `dumps` and `loads` functions
#: (pickle, simplejson etc.)
implementation = None
+ implementation_dumps_unicode = False
+ #: additional arguments for dump()
+ additional_dump_args = ()
#: the filename for the global context file
globalcontext_filename = None
@@ -949,6 +972,16 @@ class SerializingHTMLBuilder(StandaloneHTMLBuilder):
return docname[:-5] # up to sep
return docname + SEP
+ def dump_context(self, context, filename):
+ if self.implementation_dumps_unicode:
+ f = codecs.open(filename, 'w', encoding='utf-8')
+ else:
+ f = open(filename, 'wb')
+ try:
+ self.implementation.dump(context, f, *self.additional_dump_args)
+ finally:
+ f.close()
+
def handle_page(self, pagename, ctx, templatename='page.html',
outfilename=None, event_arg=None):
ctx['current_page_name'] = pagename
@@ -962,11 +995,7 @@ class SerializingHTMLBuilder(StandaloneHTMLBuilder):
ctx, event_arg)
ensuredir(path.dirname(outfilename))
- f = open(outfilename, 'wb')
- try:
- self.implementation.dump(ctx, f, 2)
- finally:
- f.close()
+ self.dump_context(ctx, outfilename)
# if there is a source file, copy the source file for the
# "show source" link
@@ -979,11 +1008,7 @@ class SerializingHTMLBuilder(StandaloneHTMLBuilder):
def handle_finish(self):
# dump the global context
outfilename = path.join(self.outdir, self.globalcontext_filename)
- f = open(outfilename, 'wb')
- try:
- self.implementation.dump(self.globalcontext, f, 2)
- finally:
- f.close()
+ self.dump_context(self.globalcontext, outfilename)
# super here to dump the search index
StandaloneHTMLBuilder.handle_finish(self)
@@ -1003,7 +1028,10 @@ class PickleHTMLBuilder(SerializingHTMLBuilder):
A Builder that dumps the generated HTML into pickle files.
"""
implementation = pickle
+ implementation_dumps_unicode = False
+ additional_dump_args = (pickle.HIGHEST_PROTOCOL,)
indexer_format = pickle
+ indexer_dumps_unicode = False
name = 'pickle'
out_suffix = '.fpickle'
globalcontext_filename = 'globalcontext.pickle'
@@ -1018,7 +1046,9 @@ class JSONHTMLBuilder(SerializingHTMLBuilder):
A builder that dumps the generated HTML into JSON files.
"""
implementation = jsonimpl
+ implementation_dumps_unicode = True
indexer_format = jsonimpl
+ indexer_dumps_unicode = True
name = 'json'
out_suffix = '.fjson'
globalcontext_filename = 'globalcontext.json'
diff --git a/sphinx/builders/htmlhelp.py b/sphinx/builders/htmlhelp.py
index 9d367183..143f6df9 100644
--- a/sphinx/builders/htmlhelp.py
+++ b/sphinx/builders/htmlhelp.py
@@ -132,6 +132,7 @@ chm_locales = {
'fr': (0x40c, 'iso8859_1'),
'it': (0x410, 'iso8859_1'),
'ja': (0x411, 'cp932'),
+ 'lv': (0x426, 'cp1257'),
'nl': (0x413, 'iso8859_1'),
'pl': (0x415, 'iso8859_2'),
'pt_BR': (0x416, 'iso8859_1'),
diff --git a/sphinx/builders/linkcheck.py b/sphinx/builders/linkcheck.py
index ee114398..ad15b55d 100644
--- a/sphinx/builders/linkcheck.py
+++ b/sphinx/builders/linkcheck.py
@@ -9,9 +9,13 @@
:license: BSD, see LICENSE for details.
"""
+import re
+import sys
+import Queue
import socket
+import threading
from os import path
-from urllib2 import build_opener, HTTPError
+from urllib2 import build_opener, Request
from docutils import nodes
@@ -23,6 +27,12 @@ opener = build_opener()
opener.addheaders = [('User-agent', 'Mozilla/5.0')]
+class HeadRequest(Request):
+ """Subclass of urllib2.Request that sends a HEAD request."""
+ def get_method(self):
+ return 'HEAD'
+
+
class CheckExternalLinksBuilder(Builder):
"""
Checks for broken external links.
@@ -30,6 +40,7 @@ class CheckExternalLinksBuilder(Builder):
name = 'linkcheck'
def init(self):
+ self.to_ignore = map(re.compile, self.app.config.linkcheck_ignore)
self.good = set()
self.broken = {}
self.redirected = {}
@@ -38,6 +49,83 @@ class CheckExternalLinksBuilder(Builder):
# create output file
open(path.join(self.outdir, 'output.txt'), 'w').close()
+ # create queues and worker threads
+ self.wqueue = Queue.Queue()
+ self.rqueue = Queue.Queue()
+ self.workers = []
+ for i in range(self.app.config.linkcheck_workers):
+ thread = threading.Thread(target=self.check_thread)
+ thread.setDaemon(True)
+ thread.start()
+ self.workers.append(thread)
+
+ def check_thread(self):
+ kwargs = {}
+ if sys.version_info > (2, 5) and self.app.config.linkcheck_timeout:
+ kwargs['timeout'] = self.app.config.linkcheck_timeout
+
+ def check():
+ # check for various conditions without bothering the network
+ if len(uri) == 0 or uri[0:7] == 'mailto:' or uri[0:4] == 'ftp:':
+ return 'unchecked', ''
+ elif not (uri[0:5] == 'http:' or uri[0:6] == 'https:'):
+ return 'local', ''
+ elif uri in self.good:
+ return 'working', ''
+ elif uri in self.broken:
+ return 'broken', self.broken[uri]
+ elif uri in self.redirected:
+ return 'redirected', self.redirected[uri]
+ for rex in self.to_ignore:
+ if rex.match(uri):
+ return 'ignored', ''
+
+ # need to actually check the URI
+ try:
+ f = opener.open(HeadRequest(uri), **kwargs)
+ f.close()
+ except Exception, err:
+ self.broken[uri] = str(err)
+ return 'broken', str(err)
+ if f.url.rstrip('/') == uri.rstrip('/'):
+ self.good.add(uri)
+ return 'working', 'new'
+ else:
+ self.redirected[uri] = f.url
+ return 'redirected', f.url
+
+ while True:
+ uri, docname, lineno = self.wqueue.get()
+ if uri is None:
+ break
+ status, info = check()
+ self.rqueue.put((uri, docname, lineno, status, info))
+
+ def process_result(self, result):
+ uri, docname, lineno, status, info = result
+ if status == 'unchecked':
+ return
+ if status == 'working' and info != 'new':
+ return
+ if lineno:
+ self.info('(line %3d) ' % lineno, nonl=1)
+ if status == 'ignored':
+ self.info(uri + ' - ' + darkgray('ignored'))
+ elif status == 'local':
+ self.info(uri + ' - ' + darkgray('local'))
+ self.write_entry('local', docname, lineno, uri)
+ elif status == 'working':
+ self.info(uri + ' - ' + darkgreen('working'))
+ elif status == 'broken':
+ self.info(uri + ' - ' + red('broken: ') + info)
+ self.write_entry('broken', docname, lineno, uri + ': ' + info)
+ if self.app.quiet:
+ self.warn('broken link: %s' % uri,
+ '%s:%s' % (self.env.doc2path(docname), lineno))
+ elif status == 'redirected':
+ self.info(uri + ' - ' + purple('redirected') + ' to ' + info)
+ self.write_entry('redirected', docname, lineno, uri + ' to ' + info)
+
def get_target_uri(self, docname, typ=None):
return ''
@@ -49,61 +137,25 @@ class CheckExternalLinksBuilder(Builder):
def write_doc(self, docname, doctree):
self.info()
+ n = 0
for node in doctree.traverse(nodes.reference):
- try:
- self.check(node, docname)
- except KeyError:
+ if 'refuri' not in node:
continue
-
- def check(self, node, docname):
- uri = node['refuri']
-
- if '#' in uri:
- uri = uri.split('#')[0]
-
- if uri in self.good:
- return
-
- lineno = None
- while lineno is None:
- node = node.parent
- if node is None:
- break
- lineno = node.line
-
- if len(uri) == 0 or uri[0:7] == 'mailto:' or uri[0:4] == 'ftp:':
- return
-
- if lineno:
- self.info('(line %3d) ' % lineno, nonl=1)
- if uri[0:5] == 'http:' or uri[0:6] == 'https:':
- self.info(uri, nonl=1)
-
- if uri in self.broken:
- (r, s) = self.broken[uri]
- elif uri in self.redirected:
- (r, s) = self.redirected[uri]
- else:
- (r, s) = self.resolve(uri)
-
- if r == 0:
- self.info(' - ' + darkgreen('working'))
- self.good.add(uri)
- elif r == 2:
- self.info(' - ' + red('broken: ') + s)
- self.write_entry('broken', docname, lineno, uri + ': ' + s)
- self.broken[uri] = (r, s)
- if self.app.quiet:
- self.warn('broken link: %s' % uri,
- '%s:%s' % (self.env.doc2path(docname), lineno))
- else:
- self.info(' - ' + purple('redirected') + ' to ' + s)
- self.write_entry('redirected', docname,
- lineno, uri + ' to ' + s)
- self.redirected[uri] = (r, s)
- else:
- self.info(uri + ' - ' + darkgray('local'))
- self.write_entry('local', docname, lineno, uri)
+ uri = node['refuri']
+ if '#' in uri:
+ uri = uri.split('#')[0]
+ lineno = None
+ while lineno is None:
+ node = node.parent
+ if node is None:
+ break
+ lineno = node.line
+ self.wqueue.put((uri, docname, lineno), False)
+ n += 1
+ done = 0
+ while done < n:
+ self.process_result(self.rqueue.get())
+ done += 1
if self.broken:
self.app.statuscode = 1
@@ -114,21 +166,6 @@ class CheckExternalLinksBuilder(Builder):
line, what, uri))
output.close()
- def resolve(self, uri):
- try:
- f = opener.open(uri)
- f.close()
- except HTTPError, err:
- #if err.code == 403 and uri.startswith('http://en.wikipedia.org/'):
- # # Wikipedia blocks requests from urllib User-Agent
- # return (0, 0)
- return (2, str(err))
- except Exception, err:
- return (2, str(err))
- if f.url.rstrip('/') == uri.rstrip('/'):
- return (0, 0)
- else:
- return (1, f.url)
-
def finish(self):
- return
+ for worker in self.workers:
+ self.wqueue.put((None, None, None), False)
diff --git a/sphinx/builders/qthelp.py b/sphinx/builders/qthelp.py
index bf536dba..5598aad2 100644
--- a/sphinx/builders/qthelp.py
+++ b/sphinx/builders/qthelp.py
@@ -130,8 +130,16 @@ class QtHelpBuilder(StandaloneHTMLBuilder):
for indexname, indexcls, content, collapse in self.domain_indices:
item = section_template % {'title': indexcls.localname,
'ref': '%s.html' % indexname}
- sections.append(' '*4*4 + item)
- sections = '\n'.join(sections)
+ sections.append((' ' * 4 * 4 + item).encode('utf-8'))
+ # sections may be unicode strings or byte strings, we have to make sure
+ # they are all byte strings before joining them
+ new_sections = []
+ for section in sections:
+ if isinstance(section, unicode):
+ new_sections.append(section.encode('utf-8'))
+ else:
+ new_sections.append(section)
+ sections = u'\n'.encode('utf-8').join(new_sections)
# keywords
keywords = []
@@ -231,7 +239,7 @@ class QtHelpBuilder(StandaloneHTMLBuilder):
link = node['refuri']
title = escape(node.astext()).replace('"','&quot;')
item = section_template % {'title': title, 'ref': link}
- item = ' '*4*indentlevel + item.encode('ascii', 'xmlcharrefreplace')
+ item = u' ' * 4 * indentlevel + item
parts.append(item.encode('ascii', 'xmlcharrefreplace'))
elif isinstance(node, nodes.bullet_list):
for subnode in node:
diff --git a/sphinx/builders/texinfo.py b/sphinx/builders/texinfo.py
new file mode 100644
index 00000000..535c527e
--- /dev/null
+++ b/sphinx/builders/texinfo.py
@@ -0,0 +1,227 @@
+# -*- coding: utf-8 -*-
+"""
+ sphinx.builders.texinfo
+ ~~~~~~~~~~~~~~~~~~~~~~~
+
+ Texinfo builder.
+
+ :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
+ :license: BSD, see LICENSE for details.
+"""
+
+from os import path
+
+from docutils import nodes
+from docutils.io import FileOutput
+from docutils.utils import new_document
+from docutils.frontend import OptionParser
+
+from sphinx import addnodes
+from sphinx.locale import _
+from sphinx.builders import Builder
+from sphinx.environment import NoUri
+from sphinx.util.nodes import inline_all_toctrees
+from sphinx.util.osutil import SEP, copyfile
+from sphinx.util.console import bold, darkgreen
+from sphinx.writers.texinfo import TexinfoWriter
+
+
+TEXINFO_MAKEFILE = '''\
+# Makefile for Sphinx Texinfo output
+
+infodir ?= /usr/share/info
+
+MAKEINFO = makeinfo --no-split
+MAKEINFO_html = makeinfo --no-split --html
+MAKEINFO_plaintext = makeinfo --no-split --plaintext
+TEXI2PDF = texi2pdf --batch --expand
+INSTALL_INFO = install-info
+
+ALLDOCS = $(basename $(wildcard *.texi))
+
+all: info
+info: $(addsuffix .info,$(ALLDOCS))
+plaintext: $(addsuffix .txt,$(ALLDOCS))
+html: $(addsuffix .html,$(ALLDOCS))
+pdf: $(addsuffix .pdf,$(ALLDOCS))
+
+install-info: info
+\tfor f in *.info; do \\
+\t cp -t $(infodir) "$$f" && \\
+\t $(INSTALL_INFO) --info-dir=$(infodir) "$$f" ; \\
+\tdone
+
+uninstall-info: info
+\tfor f in *.info; do \\
+\t rm -f "$(infodir)/$$f" ; \\
+\t $(INSTALL_INFO) --delete --info-dir=$(infodir) "$$f" ; \\
+\tdone
+
+%.info: %.texi
+\t$(MAKEINFO) -o '$@' '$<'
+
+%.txt: %.texi
+\t$(MAKEINFO_plaintext) -o '$@' '$<'
+
+%.html: %.texi
+\t$(MAKEINFO_html) -o '$@' '$<'
+
+%.pdf: %.texi
+\t-$(TEXI2PDF) '$<'
+\t-$(TEXI2PDF) '$<'
+\t-$(TEXI2PDF) '$<'
+
+clean:
+\t-rm -f *.info *.pdf *.txt *.html
+\t-rm -f *.log *.ind *.aux *.toc *.syn *.idx *.out *.ilg *.pla *.ky *.pg
+\t-rm -f *.vr *.tp *.fn *.fns *.def *.defs *.cp *.cps *.ge *.ges *.mo
+
+.PHONY: all info plaintext html pdf install-info uninstall-info clean
+'''
+
+
+class TexinfoBuilder(Builder):
+ """
+ Builds Texinfo output to create Info documentation.
+ """
+ name = 'texinfo'
+ format = 'texinfo'
+ supported_image_types = ['image/png', 'image/jpeg',
+ 'image/gif',]
+
+ def init(self):
+ self.docnames = []
+ self.document_data = []
+
+ def get_outdated_docs(self):
+ return 'all documents' # for now
+
+ def get_target_uri(self, docname, typ=None):
+ if docname not in self.docnames:
+ raise NoUri
+ 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.texinfo_documents)
+ if not preliminary_document_data:
+ self.warn('no "texinfo_documents" config value found; no documents '
+ 'will be written')
+ return
+ # assign subdirs to titles
+ self.titles = []
+ for entry in preliminary_document_data:
+ docname = entry[0]
+ if docname not in self.env.all_docs:
+ self.warn('"texinfo_documents" config value references unknown '
+ 'document %s' % docname)
+ continue
+ self.document_data.append(entry)
+ if docname.endswith(SEP+'index'):
+ docname = docname[:-5]
+ self.titles.append((docname, entry[2]))
+
+ def write(self, *ignored):
+ self.init_document_data()
+ for entry in self.document_data:
+ docname, targetname, title, author = entry[:4]
+ targetname += '.texi'
+ direntry = description = category = ''
+ if len(entry) > 6:
+ direntry, description, category = entry[4:7]
+ toctree_only = False
+ if len(entry) > 7:
+ toctree_only = entry[7]
+ destination = FileOutput(
+ destination_path=path.join(self.outdir, targetname),
+ encoding='utf-8')
+ self.info("processing " + targetname + "... ", nonl=1)
+ doctree = self.assemble_doctree(docname, toctree_only,
+ appendices=(self.config.texinfo_appendices or []))
+ self.info("writing... ", nonl=1)
+ self.post_process_images(doctree)
+ docwriter = TexinfoWriter(self)
+ settings = OptionParser(
+ defaults=self.env.settings,
+ components=(docwriter,)).get_default_values()
+ settings.author = author
+ settings.title = title
+ settings.texinfo_filename = targetname[:-5] + '.info'
+ settings.texinfo_elements = self.config.texinfo_elements
+ settings.texinfo_dir_entry = direntry or ''
+ settings.texinfo_dir_category = category or ''
+ settings.texinfo_dir_description = description or ''
+ settings.docname = docname
+ doctree.settings = settings
+ docwriter.write(doctree, destination)
+ self.info("done")
+
+ def assemble_doctree(self, indexfile, toctree_only, appendices):
+ self.docnames = set([indexfile] + appendices)
+ self.info(darkgreen(indexfile) + " ", nonl=1)
+ tree = self.env.get_doctree(indexfile)
+ tree['docname'] = indexfile
+ if toctree_only:
+ # extract toctree nodes from the tree and put them in a
+ # fresh document
+ new_tree = new_document('<texinfo output>')
+ new_sect = nodes.section()
+ new_sect += nodes.title(u'<Set title in conf.py>',
+ u'<Set title in conf.py>')
+ new_tree += new_sect
+ for node in tree.traverse(addnodes.toctree):
+ new_sect += node
+ tree = new_tree
+ largetree = inline_all_toctrees(self, self.docnames, indexfile, tree,
+ darkgreen)
+ 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)
+ # TODO: add support for external :ref:s
+ for pendingnode in largetree.traverse(addnodes.pending_xref):
+ docname = pendingnode['refdocname']
+ sectname = pendingnode['refsectname']
+ newnodes = [nodes.emphasis(sectname, sectname)]
+ for subdir, title in self.titles:
+ if docname.startswith(subdir):
+ newnodes.append(nodes.Text(_(' (in '), _(' (in ')))
+ newnodes.append(nodes.emphasis(title, title))
+ newnodes.append(nodes.Text(')', ')'))
+ break
+ else:
+ pass
+ pendingnode.replace_self(newnodes)
+ return largetree
+
+ def finish(self):
+ # copy image files
+ if self.images:
+ self.info(bold('copying images...'), nonl=1)
+ for src, dest in self.images.iteritems():
+ self.info(' '+src, nonl=1)
+ copyfile(path.join(self.srcdir, src),
+ path.join(self.outdir, dest))
+ self.info()
+
+ self.info(bold('copying Texinfo support files... '), nonl=True)
+ # copy Makefile
+ fn = path.join(self.outdir, 'Makefile')
+ self.info(fn, nonl=1)
+ try:
+ mkfile = open(fn, 'w')
+ try:
+ mkfile.write(TEXINFO_MAKEFILE)
+ finally:
+ mkfile.close()
+ except (IOError, OSError), err:
+ self.warn("error writing file %s: %s" % (fn, err))
+ self.info(' done')
diff --git a/sphinx/builders/websupport.py b/sphinx/builders/websupport.py
new file mode 100644
index 00000000..b7757309
--- /dev/null
+++ b/sphinx/builders/websupport.py
@@ -0,0 +1,155 @@
+# -*- coding: utf-8 -*-
+"""
+ sphinx.builders.websupport
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ Builder for the web support package.
+
+ :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
+ :license: BSD, see LICENSE for details.
+"""
+
+from os import path
+import posixpath
+import shutil
+
+from docutils.io import StringOutput
+
+from sphinx.jinja2glue import BuiltinTemplateLoader
+from sphinx.util.osutil import os_path, relative_uri, ensuredir, copyfile
+from sphinx.builders.html import PickleHTMLBuilder
+from sphinx.writers.websupport import WebSupportTranslator
+
+
+class WebSupportBuilder(PickleHTMLBuilder):
+ """
+ Builds documents for the web support package.
+ """
+ name = 'websupport'
+ versioning_method = 'commentable'
+
+ def init(self):
+ PickleHTMLBuilder.init(self)
+ # templates are needed for this builder, but the serializing
+ # builder does not initialize them
+ self.init_templates()
+ if not isinstance(self.templates, BuiltinTemplateLoader):
+ raise RuntimeError('websupport builder must be used with '
+ 'the builtin templates')
+ # add our custom JS
+ self.script_files.append('_static/websupport.js')
+
+ def set_webinfo(self, staticdir, virtual_staticdir, search, storage):
+ self.staticdir = staticdir
+ self.virtual_staticdir = virtual_staticdir
+ self.search = search
+ self.storage = storage
+
+ def init_translator_class(self):
+ self.translator_class = WebSupportTranslator
+
+ def prepare_writing(self, docnames):
+ PickleHTMLBuilder.prepare_writing(self, docnames)
+ self.globalcontext['no_search_suffix'] = True
+
+ def write_doc(self, docname, doctree):
+ destination = StringOutput(encoding='utf-8')
+ doctree.settings = self.docsettings
+
+ self.cur_docname = docname
+ self.secnumbers = self.env.toc_secnumbers.get(docname, {})
+ self.imgpath = '/' + posixpath.join(self.virtual_staticdir, '_images')
+ self.post_process_images(doctree)
+ self.dlpath = '/' + posixpath.join(self.virtual_staticdir, '_downloads')
+ self.docwriter.write(doctree, destination)
+ self.docwriter.assemble_parts()
+ body = self.docwriter.parts['fragment']
+ metatags = self.docwriter.clean_meta
+
+ ctx = self.get_doc_context(docname, body, metatags)
+ self.index_page(docname, doctree, ctx.get('title', ''))
+ self.handle_page(docname, ctx, event_arg=doctree)
+
+ def load_indexer(self, docnames):
+ self.indexer = self.search
+ self.indexer.init_indexing(changed=docnames)
+
+ def _render_page(self, pagename, addctx, templatename, event_arg=None):
+ # This is mostly copied from StandaloneHTMLBuilder. However, instead
+ # of rendering the template and saving the html, create a context
+ # dict and pickle it.
+ ctx = self.globalcontext.copy()
+ ctx['pagename'] = pagename
+
+ def pathto(otheruri, resource=False,
+ baseuri=self.get_target_uri(pagename)):
+ if resource and '://' in otheruri:
+ return otheruri
+ elif not resource:
+ otheruri = self.get_target_uri(otheruri)
+ return relative_uri(baseuri, otheruri) or '#'
+ else:
+ return '/' + posixpath.join(self.virtual_staticdir, otheruri)
+ ctx['pathto'] = pathto
+ ctx['hasdoc'] = lambda name: name in self.env.all_docs
+ ctx['encoding'] = self.config.html_output_encoding
+ ctx['toctree'] = lambda **kw: self._get_local_toctree(pagename, **kw)
+ self.add_sidebars(pagename, ctx)
+ ctx.update(addctx)
+
+ self.app.emit('html-page-context', pagename, templatename,
+ ctx, event_arg)
+
+ # create a dict that will be pickled and used by webapps
+ doc_ctx = {
+ 'body': ctx.get('body', ''),
+ 'title': ctx.get('title', ''),
+ }
+ # partially render the html template to get at interesting macros
+ template = self.templates.environment.get_template(templatename)
+ template_module = template.make_module(ctx)
+ for item in ['sidebar', 'relbar', 'script', 'css']:
+ if hasattr(template_module, item):
+ doc_ctx[item] = getattr(template_module, item)()
+
+ return ctx, doc_ctx
+
+ def handle_page(self, pagename, addctx, templatename='page.html',
+ outfilename=None, event_arg=None):
+ ctx, doc_ctx = self._render_page(pagename, addctx,
+ templatename, event_arg)
+
+ if not outfilename:
+ outfilename = path.join(self.outdir, 'pickles',
+ os_path(pagename) + self.out_suffix)
+ ensuredir(path.dirname(outfilename))
+ self.dump_context(doc_ctx, outfilename)
+
+ # if there is a source file, copy the source file for the
+ # "show source" link
+ if ctx.get('sourcename'):
+ source_name = path.join(self.staticdir,
+ '_sources', os_path(ctx['sourcename']))
+ ensuredir(path.dirname(source_name))
+ copyfile(self.env.doc2path(pagename), source_name)
+
+ def handle_finish(self):
+ # get global values for css and script files
+ _, doc_ctx = self._render_page('tmp', {}, 'page.html')
+ self.globalcontext['css'] = doc_ctx['css']
+ self.globalcontext['script'] = doc_ctx['script']
+
+ PickleHTMLBuilder.handle_finish(self)
+
+ # move static stuff over to separate directory
+ directories = ['_images', '_static']
+ for directory in directories:
+ src = path.join(self.outdir, directory)
+ dst = path.join(self.staticdir, directory)
+ if path.isdir(src):
+ if path.isdir(dst):
+ shutil.rmtree(dst)
+ shutil.move(src, dst)
+
+ def dump_search_index(self):
+ self.indexer.finish_indexing()
diff --git a/sphinx/cmdline.py b/sphinx/cmdline.py
index 5be530be..5340aa88 100644
--- a/sphinx/cmdline.py
+++ b/sphinx/cmdline.py
@@ -22,6 +22,7 @@ from sphinx.errors import SphinxError
from sphinx.application import Sphinx
from sphinx.util import Tee, format_exception_cut_frames, save_traceback
from sphinx.util.console import red, nocolor, color_terminal
+from sphinx.util.pycompat import terminal_safe
def usage(argv, msg=None):
@@ -190,8 +191,7 @@ def main(argv):
except KeyboardInterrupt:
if use_pdb:
import pdb
- print >>error, red('Interrupted while building, '
- 'starting debugger:')
+ print >>error, red('Interrupted while building, starting debugger:')
traceback.print_exc()
pdb.post_mortem(sys.exc_info()[2])
return 1
@@ -199,17 +199,17 @@ def main(argv):
if use_pdb:
import pdb
print >>error, red('Exception occurred while building, '
- 'starting debugger:')
+ 'starting debugger:')
traceback.print_exc()
pdb.post_mortem(sys.exc_info()[2])
else:
print >>error
if isinstance(err, SystemMessage):
print >>error, red('reST markup error:')
- print >>error, err.args[0].encode('ascii', 'backslashreplace')
+ print >>error, terminal_safe(err.args[0])
elif isinstance(err, SphinxError):
print >>error, red('%s:' % err.category)
- print >>error, unicode(err).encode('ascii', 'backslashreplace')
+ print >>error, terminal_safe(unicode(err))
else:
print >>error, red('Exception occurred:')
print >>error, format_exception_cut_frames().rstrip()
diff --git a/sphinx/config.py b/sphinx/config.py
index 19e29919..b05054c6 100644
--- a/sphinx/config.py
+++ b/sphinx/config.py
@@ -11,16 +11,24 @@
import os
import re
+import sys
from os import path
from sphinx.errors import ConfigError
+from sphinx.locale import l_
from sphinx.util.osutil import make_filename
+from sphinx.util.pycompat import bytes, b, convert_with_2to3
-nonascii_re = re.compile(r'[\x80-\xff]')
+nonascii_re = re.compile(b(r'[\x80-\xff]'))
+CONFIG_SYNTAX_ERROR = "There is a syntax error in your configuration file: %s"
+if sys.version_info >= (3, 0):
+ CONFIG_SYNTAX_ERROR += "\nDid you change the syntax from 2.x to 3.x?"
class Config(object):
- """Configuration file abstraction."""
+ """
+ Configuration file abstraction.
+ """
# the values are: (default, what needs to be rebuilt if changed)
@@ -64,12 +72,13 @@ class Config(object):
primary_domain = ('py', 'env'),
needs_sphinx = (None, None),
nitpicky = (False, 'env'),
+ nitpick_ignore = ([], 'env'),
# HTML options
html_theme = ('default', 'html'),
html_theme_path = ([], 'html'),
html_theme_options = ({}, 'html'),
- html_title = (lambda self: '%s v%s documentation' %
+ html_title = (lambda self: l_('%s %s documentation') %
(self.project, self.release),
'html'),
html_short_title = (lambda self: self.html_title, 'html'),
@@ -85,7 +94,7 @@ class Config(object):
html_additional_pages = ({}, 'html'),
html_use_modindex = (True, 'html'), # deprecated
html_domain_indices = (True, 'html'),
- html_add_permalinks = (True, 'html'),
+ html_add_permalinks = (u'\u00B6', 'html'),
html_use_index = (True, 'html'),
html_split_index = (False, 'html'),
html_copy_source = (True, 'html'),
@@ -99,6 +108,8 @@ class Config(object):
html_output_encoding = ('utf-8', 'html'),
html_compact_lists = (True, 'html'),
html_secnumber_suffix = ('. ', 'html'),
+ html_search_language = (None, 'html'),
+ html_search_options = ({}, 'html'),
# HTML help only options
htmlhelp_basename = (lambda self: make_filename(self.project), None),
@@ -120,6 +131,7 @@ class Config(object):
epub_identifier = ('unknown', 'html'),
epub_scheme = ('unknown', 'html'),
epub_uid = ('unknown', 'env'),
+ epub_cover = ((), 'env'),
epub_pre_files = ([], 'env'),
epub_post_files = ([], 'env'),
epub_exclude_files = ([], 'env'),
@@ -133,7 +145,7 @@ class Config(object):
latex_use_parts = (False, None),
latex_use_modindex = (True, None), # deprecated
latex_domain_indices = (True, None),
- latex_show_urls = (False, None),
+ latex_show_urls = ('no', None),
latex_show_pagerefs = (False, None),
# paper_size and font_size are still separate values
# so that you can give them easily on the command line
@@ -146,11 +158,27 @@ class Config(object):
latex_preamble = ('', None),
# text options
- text_sectionchars = ('*=-~"+`', 'text'),
- text_windows_newlines = (False, 'text'),
+ text_sectionchars = ('*=-~"+`', 'env'),
+ text_newlines = ('unix', 'env'),
# manpage options
man_pages = ([], None),
+ man_show_urls = (False, None),
+
+ # Texinfo options
+ texinfo_documents = ([], None),
+ texinfo_appendices = ([], None),
+ texinfo_elements = ({}, None),
+ texinfo_domain_indices = (True, None),
+ texinfo_show_urls = ('footnote', None),
+
+ # linkcheck options
+ linkcheck_ignore = ([], None),
+ linkcheck_timeout = (None, None),
+ linkcheck_workers = (5, None),
+
+ # gettext options
+ gettext_compact = (True, 'gettext'),
)
def __init__(self, dirname, filename, overrides, tags):
@@ -163,12 +191,30 @@ class Config(object):
config['tags'] = tags
olddir = os.getcwd()
try:
+ # we promise to have the config dir as current dir while the
+ # config file is executed
+ os.chdir(dirname)
+ # get config source
+ f = open(config_file, 'rb')
+ try:
+ source = f.read()
+ finally:
+ f.close()
try:
- os.chdir(dirname)
- execfile(config['__file__'], config)
+ # compile to a code object, handle syntax errors
+ try:
+ code = compile(source, config_file, 'exec')
+ except SyntaxError:
+ if convert_with_2to3:
+ # maybe the file uses 2.x syntax; try to refactor to
+ # 3.x syntax using 2to3
+ source = convert_with_2to3(config_file)
+ code = compile(source, config_file, 'exec')
+ else:
+ raise
+ exec code in config
except SyntaxError, err:
- raise ConfigError('There is a syntax error in your '
- 'configuration file: ' + str(err))
+ raise ConfigError(CONFIG_SYNTAX_ERROR % err)
finally:
os.chdir(olddir)
@@ -182,10 +228,11 @@ class Config(object):
# check all string values for non-ASCII characters in bytestrings,
# since that can result in UnicodeErrors all over the place
for name, value in self._raw_config.iteritems():
- if isinstance(value, str) and nonascii_re.search(value):
+ if isinstance(value, bytes) and nonascii_re.search(value):
warn('the config value %r is set to a string with non-ASCII '
'characters; this can lead to Unicode errors occurring. '
- 'Please use Unicode strings, e.g. u"Content".' % name)
+ 'Please use Unicode strings, e.g. %r.' % (name, u'Content')
+ )
def init_values(self):
config = self._raw_config
diff --git a/sphinx/directives/code.py b/sphinx/directives/code.py
index ca2ea61b..c45e1b36 100644
--- a/sphinx/directives/code.py
+++ b/sphinx/directives/code.py
@@ -7,10 +7,8 @@
:license: BSD, see LICENSE for details.
"""
-import os
import sys
import codecs
-from os import path
from docutils import nodes
from docutils.parsers.rst import Directive, directives
@@ -58,13 +56,28 @@ class CodeBlock(Directive):
final_argument_whitespace = False
option_spec = {
'linenos': directives.flag,
+ 'emphasize-lines': directives.unchanged_required,
}
def run(self):
code = u'\n'.join(self.content)
+
+ linespec = self.options.get('emphasize-lines')
+ if linespec:
+ try:
+ nlines = len(self.content)
+ hl_lines = [x+1 for x in parselinenos(linespec, nlines)]
+ except ValueError, err:
+ document = self.state.document
+ return [document.reporter.warning(str(err), line=self.lineno)]
+ else:
+ hl_lines = None
+
literal = nodes.literal_block(code, code)
literal['language'] = self.arguments[0]
literal['linenos'] = 'linenos' in self.options
+ if hl_lines is not None:
+ literal['highlight_args'] = {'hl_lines': hl_lines}
set_source_info(self, literal)
return [literal]
@@ -91,27 +104,16 @@ class LiteralInclude(Directive):
'end-before': directives.unchanged_required,
'prepend': directives.unchanged_required,
'append': directives.unchanged_required,
+ 'emphasize-lines': directives.unchanged_required,
}
def run(self):
document = self.state.document
- filename = self.arguments[0]
if not document.settings.file_insertion_enabled:
return [document.reporter.warning('File insertion disabled',
line=self.lineno)]
env = document.settings.env
- if filename.startswith('/') or filename.startswith(os.sep):
- rel_fn = filename[1:]
- else:
- docdir = path.dirname(env.doc2path(env.docname, base=None))
- rel_fn = path.join(docdir, filename)
- try:
- fn = path.join(env.srcdir, rel_fn)
- except UnicodeDecodeError:
- # the source directory is a bytestring with non-ASCII characters;
- # let's try to encode the rel_fn in the file system encoding
- rel_fn = rel_fn.encode(sys.getfilesystemencoding())
- fn = path.join(env.srcdir, rel_fn)
+ rel_filename, filename = env.relfn2path(self.arguments[0])
if 'pyobject' in self.options and 'lines' in self.options:
return [document.reporter.warning(
@@ -121,7 +123,7 @@ class LiteralInclude(Directive):
encoding = self.options.get('encoding', env.config.source_encoding)
codec_info = codecs.lookup(encoding)
try:
- f = codecs.StreamReaderWriter(open(fn, 'U'),
+ f = codecs.StreamReaderWriter(open(filename, 'rb'),
codec_info[2], codec_info[3], 'strict')
lines = f.readlines()
f.close()
@@ -138,7 +140,7 @@ class LiteralInclude(Directive):
objectname = self.options.get('pyobject')
if objectname is not None:
from sphinx.pycode import ModuleAnalyzer
- analyzer = ModuleAnalyzer.for_file(fn, '')
+ analyzer = ModuleAnalyzer.for_file(filename, '')
tags = analyzer.find_tags()
if objectname not in tags:
return [document.reporter.warning(
@@ -161,6 +163,15 @@ class LiteralInclude(Directive):
'Line spec %r: no lines pulled from include file %r' %
(linespec, filename), line=self.lineno)]
+ linespec = self.options.get('emphasize-lines')
+ if linespec:
+ try:
+ hl_lines = [x+1 for x in parselinenos(linespec, len(lines))]
+ except ValueError, err:
+ return [document.reporter.warning(str(err), line=self.lineno)]
+ else:
+ hl_lines = None
+
startafter = self.options.get('start-after')
endbefore = self.options.get('end-before')
prepend = self.options.get('prepend')
@@ -186,13 +197,15 @@ class LiteralInclude(Directive):
text = ''.join(lines)
if self.options.get('tab-width'):
text = text.expandtabs(self.options['tab-width'])
- retnode = nodes.literal_block(text, text, source=fn)
+ retnode = nodes.literal_block(text, text, source=filename)
set_source_info(self, retnode)
if self.options.get('language', ''):
retnode['language'] = self.options['language']
if 'linenos' in self.options:
retnode['linenos'] = True
- document.settings.env.note_dependency(rel_fn)
+ if hl_lines is not None:
+ retnode['highlight_args'] = {'hl_lines': hl_lines}
+ env.note_dependency(rel_filename)
return [retnode]
diff --git a/sphinx/directives/other.py b/sphinx/directives/other.py
index 606c559b..aa4142d6 100644
--- a/sphinx/directives/other.py
+++ b/sphinx/directives/other.py
@@ -11,21 +11,29 @@ import os
from docutils import nodes
from docutils.parsers.rst import Directive, directives
+from docutils.parsers.rst.directives.misc import Class
+from docutils.parsers.rst.directives.misc import Include as BaseInclude
from sphinx import addnodes
-from sphinx.locale import pairindextypes, _
+from sphinx.locale import _
from sphinx.util import url_re, docname_join
-from sphinx.util.nodes import explicit_title_re, set_source_info
+from sphinx.util.nodes import explicit_title_re, set_source_info, \
+ process_index_entry
from sphinx.util.compat import make_admonition
from sphinx.util.matching import patfilter
+def int_or_nothing(argument):
+ if not argument:
+ return 999
+ return int(argument)
+
+
class TocTree(Directive):
"""
Directive to notify Sphinx about the hierarchical structure of the docs,
and to include a table-of-contents like tree in the current document.
"""
-
has_content = True
required_arguments = 0
optional_arguments = 0
@@ -34,7 +42,7 @@ class TocTree(Directive):
'maxdepth': int,
'glob': directives.flag,
'hidden': directives.flag,
- 'numbered': directives.flag,
+ 'numbered': int_or_nothing,
'titlesonly': directives.flag,
}
@@ -99,7 +107,7 @@ class TocTree(Directive):
subnode['maxdepth'] = self.options.get('maxdepth', -1)
subnode['glob'] = glob
subnode['hidden'] = 'hidden' in self.options
- subnode['numbered'] = 'numbered' in self.options
+ subnode['numbered'] = self.options.get('numbered', 0)
subnode['titlesonly'] = 'titlesonly' in self.options
set_source_info(self, subnode)
wrappernode = nodes.compound(classes=['toctree-wrapper'])
@@ -113,7 +121,6 @@ class Author(Directive):
Directive to give the name of the author of the current document
or section. Shown in the output only if the show_authors option is on.
"""
-
has_content = False
required_arguments = 1
optional_arguments = 0
@@ -146,17 +153,12 @@ class Index(Directive):
"""
Directive to add entries to the index.
"""
-
has_content = False
required_arguments = 1
optional_arguments = 0
final_argument_whitespace = True
option_spec = {}
- indextypes = [
- 'single', 'pair', 'double', 'triple',
- ]
-
def run(self):
arguments = self.arguments[0].split('\n')
env = self.state.document.settings.env
@@ -167,28 +169,7 @@ class Index(Directive):
indexnode['entries'] = ne = []
indexnode['inline'] = False
for entry in arguments:
- entry = entry.strip()
- for type in pairindextypes:
- if entry.startswith(type+':'):
- value = entry[len(type)+1:].strip()
- value = pairindextypes[type] + '; ' + value
- ne.append(('pair', value, targetid, value))
- break
- else:
- for type in self.indextypes:
- if entry.startswith(type+':'):
- value = entry[len(type)+1:].strip()
- if type == 'double':
- type = 'pair'
- ne.append((type, value, targetid, value))
- break
- # shorthand notation for single entries
- else:
- for value in entry.split(','):
- value = value.strip()
- if not value:
- continue
- ne.append(('single', value, targetid, value))
+ ne.extend(process_index_entry(entry, targetid))
return [indexnode, targetnode]
@@ -196,7 +177,6 @@ class VersionChange(Directive):
"""
Directive to describe a change/addition/deprecation in a specific version.
"""
-
has_content = True
required_arguments = 1
optional_arguments = 1
@@ -228,7 +208,6 @@ class SeeAlso(Directive):
"""
An admonition mentioning things to look at as reference.
"""
-
has_content = True
required_arguments = 0
optional_arguments = 1
@@ -254,7 +233,6 @@ class TabularColumns(Directive):
"""
Directive to give an explicit tabulary column definition to LaTeX.
"""
-
has_content = False
required_arguments = 1
optional_arguments = 0
@@ -272,7 +250,6 @@ class Centered(Directive):
"""
Directive to create a centered line of bold text.
"""
-
has_content = False
required_arguments = 1
optional_arguments = 0
@@ -289,12 +266,10 @@ class Centered(Directive):
return [subnode] + messages
-
class Acks(Directive):
"""
Directive for a list of names.
"""
-
has_content = True
required_arguments = 0
optional_arguments = 0
@@ -316,7 +291,6 @@ class HList(Directive):
"""
Directive for a list that gets compacted horizontally.
"""
-
has_content = True
required_arguments = 0
optional_arguments = 0
@@ -353,7 +327,6 @@ class Only(Directive):
"""
Directive to only include text if the given tag(s) are enabled.
"""
-
has_content = True
required_arguments = 1
optional_arguments = 0
@@ -370,19 +343,20 @@ class Only(Directive):
return [node]
-from docutils.parsers.rst.directives.misc import Include as BaseInclude
-
class Include(BaseInclude):
"""
Like the standard "Include" directive, but interprets absolute paths
- correctly.
+ "correctly", i.e. relative to source directory.
"""
def run(self):
- path = self.arguments[0]
- if path.startswith('/') or path.startswith(os.sep):
- env = self.state.document.settings.env
- self.arguments[0] = os.path.join(env.srcdir, path[1:])
+ env = self.state.document.settings.env
+ if self.arguments[0].startswith('<') and \
+ self.arguments[0].endswith('>'):
+ # docutils "standard" includes, do not do path processing
+ return BaseInclude.run(self)
+ rel_filename, filename = env.relfn2path(self.arguments[0])
+ self.arguments[0] = filename
return BaseInclude.run(self)
@@ -403,7 +377,6 @@ directives.register_directive('only', Only)
directives.register_directive('include', Include)
# register the standard rst class directive under a different name
-from docutils.parsers.rst.directives.misc import Class
# only for backwards compatibility now
directives.register_directive('cssclass', Class)
# new standard name when default-domain with "class" is in effect
diff --git a/sphinx/domains/__init__.py b/sphinx/domains/__init__.py
index 1d04a593..c48568eb 100644
--- a/sphinx/domains/__init__.py
+++ b/sphinx/domains/__init__.py
@@ -66,9 +66,8 @@ class Index(object):
self.domain = domain
def generate(self, docnames=None):
- """
- Return entries for the index given by *name*. If *docnames* is given,
- restrict to entries referring to these docnames.
+ """Return entries for the index given by *name*. If *docnames* is
+ given, restrict to entries referring to these docnames.
The return value is a tuple of ``(content, collapse)``, where *collapse*
is a boolean that determines if sub-entries should start collapsed (for
@@ -160,8 +159,7 @@ class Domain(object):
self.objtypes_for_role = self._role2type.get
def role(self, name):
- """
- Return a role adapter function that always gives the registered
+ """Return a role adapter function that always gives the registered
role its full name ('domain:name') as the first argument.
"""
if name in self._role_cache:
@@ -177,8 +175,7 @@ class Domain(object):
return role_adapter
def directive(self, name):
- """
- Return a directive adapter class that always gives the registered
+ """Return a directive adapter class that always gives the registered
directive its full name ('domain:name') as ``self.name``.
"""
if name in self._directive_cache:
@@ -197,21 +194,16 @@ class Domain(object):
# methods that should be overwritten
def clear_doc(self, docname):
- """
- Remove traces of a document in the domain-specific inventories.
- """
+ """Remove traces of a document in the domain-specific inventories."""
pass
def process_doc(self, env, docname, document):
- """
- Process a document after it is read by the environment.
- """
+ """Process a document after it is read by the environment."""
pass
def resolve_xref(self, env, fromdocname, builder,
typ, target, node, contnode):
- """
- Resolve the ``pending_xref`` *node* with the given *typ* and *target*.
+ """Resolve the pending_xref *node* with the given *typ* and *target*.
This method should return a new node, to replace the xref node,
containing the *contnode* which is the markup content of the
@@ -227,8 +219,7 @@ class Domain(object):
pass
def get_objects(self):
- """
- Return an iterable of "object descriptions", which are tuples with
+ """Return an iterable of "object descriptions", which are tuples with
five items:
* `name` -- fully qualified name
@@ -247,9 +238,7 @@ class Domain(object):
return []
def get_type_name(self, type, primary=False):
- """
- Return full name for given ObjType.
- """
+ """Return full name for given ObjType."""
if primary:
return type.lname
return _('%s %s') % (self.label, type.lname)
diff --git a/sphinx/domains/c.py b/sphinx/domains/c.py
index 253fd345..f1848dbd 100644
--- a/sphinx/domains/c.py
+++ b/sphinx/domains/c.py
@@ -167,7 +167,7 @@ class CObject(ObjectDescription):
indextext = self.get_index_text(name)
if indextext:
- self.indexnode['entries'].append(('single', indextext, name, name))
+ self.indexnode['entries'].append(('single', indextext, name, ''))
def before_content(self):
self.typename_set = False
diff --git a/sphinx/domains/cpp.py b/sphinx/domains/cpp.py
index 3349e32c..7a4e479a 100644
--- a/sphinx/domains/cpp.py
+++ b/sphinx/domains/cpp.py
@@ -21,6 +21,7 @@ from sphinx.domains import Domain, ObjType
from sphinx.directives import ObjectDescription
from sphinx.util.nodes import make_refnode
from sphinx.util.compat import Directive
+from sphinx.util.docfields import Field, GroupedField
_identifier_re = re.compile(r'(~?\b[a-zA-Z_][a-zA-Z0-9_]*)\b')
@@ -111,7 +112,7 @@ class DefinitionError(Exception):
return self.description
def __str__(self):
- return unicode(self.encode('utf-8'))
+ return unicode(self).encode('utf-8')
class DefExpr(object):
@@ -133,17 +134,21 @@ class DefExpr(object):
def __ne__(self, other):
return not self.__eq__(other)
+ __hash__ = None
+
def clone(self):
- """Close a definition expression node"""
+ """Clone a definition expression node."""
return deepcopy(self)
def get_id(self):
- """Returns the id for the node"""
+ """Return the id for the node."""
return u''
def get_name(self):
- """Returns the name. Returns either `None` or a node with
- a name you might call :meth:`split_owner` on.
+ """Return the name.
+
+ Returns either `None` or a node with a name you might call
+ :meth:`split_owner` on.
"""
return None
@@ -156,7 +161,7 @@ class DefExpr(object):
return None, self
def prefix(self, prefix):
- """Prefixes a name node (a node returned by :meth:`get_name`)."""
+ """Prefix a name node (a node returned by :meth:`get_name`)."""
raise NotImplementedError()
def __str__(self):
@@ -891,6 +896,17 @@ class DefinitionParser(object):
class CPPObject(ObjectDescription):
"""Description of a C++ language object."""
+ doc_field_types = [
+ GroupedField('parameter', label=l_('Parameters'),
+ names=('param', 'parameter', 'arg', 'argument'),
+ can_collapse=True),
+ GroupedField('exceptions', label=l_('Throws'), rolename='cpp:class',
+ names=('throws', 'throw', 'exception'),
+ can_collapse=True),
+ Field('returnvalue', label=l_('Returns'), has_arg=False,
+ names=('returns', 'return')),
+ ]
+
def attach_name(self, node, name):
owner, name = name.split_owner()
varname = unicode(name)
@@ -939,7 +955,7 @@ class CPPObject(ObjectDescription):
indextext = self.get_index_text(name)
if indextext:
- self.indexnode['entries'].append(('single', indextext, theid, name))
+ self.indexnode['entries'].append(('single', indextext, theid, ''))
def before_content(self):
lastname = self.names and self.names[-1]
@@ -1091,8 +1107,9 @@ class CPPFunctionObject(CPPObject):
class CPPCurrentNamespace(Directive):
- """This directive is just to tell Sphinx that we're documenting
- stuff in namespace foo.
+ """
+ This directive is just to tell Sphinx that we're documenting stuff in
+ namespace foo.
"""
has_content = False
@@ -1189,7 +1206,7 @@ class CPPDomain(Domain):
env.warn_node('unparseable C++ definition: %r' % target, node)
return None
- parent = node['cpp:parent']
+ parent = node.get('cpp:parent', None)
rv = _create_refnode(expr)
if rv is not None or parent is None:
diff --git a/sphinx/domains/javascript.py b/sphinx/domains/javascript.py
index 80d25ad0..a6f4e87c 100644
--- a/sphinx/domains/javascript.py
+++ b/sphinx/domains/javascript.py
@@ -97,7 +97,7 @@ class JSObject(ObjectDescription):
if indextext:
self.indexnode['entries'].append(('single', indextext,
fullname.replace('$', '_S_'),
- fullname))
+ ''))
def get_index_text(self, objectname, name_obj):
name, obj = name_obj
@@ -127,11 +127,13 @@ class JSCallable(JSObject):
can_collapse=True),
Field('returnvalue', label=l_('Returns'), has_arg=False,
names=('returns', 'return')),
+ Field('returntype', label=l_('Return type'), has_arg=False,
+ names=('rtype',)),
]
class JSConstructor(JSCallable):
- """Like a callable but with a different prefix"""
+ """Like a callable but with a different prefix."""
display_prefix = 'class '
diff --git a/sphinx/domains/python.py b/sphinx/domains/python.py
index e812b610..98d93545 100644
--- a/sphinx/domains/python.py
+++ b/sphinx/domains/python.py
@@ -88,6 +88,7 @@ class PyObject(ObjectDescription):
option_spec = {
'noindex': directives.flag,
'module': directives.unchanged,
+ 'annotation': directives.unchanged,
}
doc_field_types = [
@@ -110,22 +111,21 @@ class PyObject(ObjectDescription):
]
def get_signature_prefix(self, sig):
- """
- May return a prefix to put before the object name in the signature.
+ """May return a prefix to put before the object name in the
+ signature.
"""
return ''
def needs_arglist(self):
- """
- May return true if an empty argument list is to be generated even if
+ """May return true if an empty argument list is to be generated even if
the document contains none.
"""
return False
def handle_signature(self, sig, signode):
- """
- Transform a Python signature into RST nodes.
- Returns (fully qualified name of the thing, classname if any).
+ """Transform a Python signature into RST nodes.
+
+ Return (fully qualified name of the thing, classname if any).
If inside a class, the current class name is handled intelligently:
* it is stripped from the displayed name if present
@@ -181,6 +181,8 @@ class PyObject(ObjectDescription):
nodetext = modname + '.'
signode += addnodes.desc_addname(nodetext, nodetext)
+ anno = self.options.get('annotation')
+
signode += addnodes.desc_name(name, name)
if not arglist:
if self.needs_arglist():
@@ -188,16 +190,19 @@ class PyObject(ObjectDescription):
signode += addnodes.desc_parameterlist()
if retann:
signode += addnodes.desc_returns(retann, retann)
+ if anno:
+ signode += addnodes.desc_annotation(' ' + anno, ' ' + anno)
return fullname, name_prefix
+
_pseudo_parse_arglist(signode, arglist)
if retann:
signode += addnodes.desc_returns(retann, retann)
+ if anno:
+ signode += addnodes.desc_annotation(' ' + anno, ' ' + anno)
return fullname, name_prefix
def get_index_text(self, modname, name):
- """
- Return the text for the index entry of the object.
- """
+ """Return the text for the index entry of the object."""
raise NotImplementedError('must be implemented in subclasses')
def add_target_and_index(self, name_cls, sig, signode):
@@ -223,7 +228,7 @@ class PyObject(ObjectDescription):
indextext = self.get_index_text(modname, name_cls)
if indextext:
self.indexnode['entries'].append(('single', indextext,
- fullname, fullname))
+ fullname, ''))
def before_content(self):
# needed for automatic qualification of members (reset in subclasses)
@@ -359,6 +364,38 @@ class PyClassmember(PyObject):
self.clsname_set = True
+class PyDecoratorMixin(object):
+ """
+ Mixin for decorator directives.
+ """
+ def handle_signature(self, sig, signode):
+ ret = super(PyDecoratorMixin, self).handle_signature(sig, signode)
+ signode.insert(0, addnodes.desc_addname('@', '@'))
+ return ret
+
+ def needs_arglist(self):
+ return False
+
+
+class PyDecoratorFunction(PyDecoratorMixin, PyModulelevel):
+ """
+ Directive to mark functions meant to be used as decorators.
+ """
+ def run(self):
+ # a decorator function is a function after all
+ self.name = 'py:function'
+ return PyModulelevel.run(self)
+
+
+class PyDecoratorMethod(PyDecoratorMixin, PyClassmember):
+ """
+ Directive to mark methods meant to be used as decorators.
+ """
+ def run(self):
+ self.name = 'py:method'
+ return PyClassmember.run(self)
+
+
class PyModule(Directive):
"""
Directive to mark description of a new module.
@@ -385,26 +422,17 @@ class PyModule(Directive):
env.domaindata['py']['modules'][modname] = \
(env.docname, self.options.get('synopsis', ''),
self.options.get('platform', ''), 'deprecated' in self.options)
- # make a duplicate entry in 'objects' to facilitate searching for
- # the module in PythonDomain.find_obj()
+ # make a duplicate entry in 'objects' to facilitate searching for the
+ # module in PythonDomain.find_obj()
env.domaindata['py']['objects'][modname] = (env.docname, 'module')
- targetnode = nodes.target('', '', ids=['module-' + modname],
- ismod=True)
+ targetnode = nodes.target('', '', ids=['module-' + modname], ismod=True)
self.state.document.note_explicit_target(targetnode)
+ # the platform and synopsis aren't printed; in fact, they are only used
+ # in the modindex currently
ret.append(targetnode)
- # XXX this behavior of the module directive is a mess...
- if 'platform' in self.options:
- platform = self.options['platform']
- node = nodes.paragraph()
- node += nodes.emphasis('', _('Platforms: '))
- node += nodes.Text(platform, platform)
- ret.append(node)
- # the synopsis isn't printed; in fact, it is only used in the
- # modindex currently
- if not noindex:
indextext = _('%s (module)') % modname
inode = addnodes.index(entries=[('single', indextext,
- 'module-' + modname, modname)])
+ 'module-' + modname, '')])
ret.append(inode)
return ret
@@ -539,16 +567,18 @@ class PythonDomain(Domain):
}
directives = {
- 'function': PyModulelevel,
- 'data': PyModulelevel,
- 'class': PyClasslike,
- 'exception': PyClasslike,
- 'method': PyClassmember,
- 'classmethod': PyClassmember,
- 'staticmethod': PyClassmember,
- 'attribute': PyClassmember,
- 'module': PyModule,
- 'currentmodule': PyCurrentModule,
+ 'function': PyModulelevel,
+ 'data': PyModulelevel,
+ 'class': PyClasslike,
+ 'exception': PyClasslike,
+ 'method': PyClassmember,
+ 'classmethod': PyClassmember,
+ 'staticmethod': PyClassmember,
+ 'attribute': PyClassmember,
+ 'module': PyModule,
+ 'currentmodule': PyCurrentModule,
+ 'decorator': PyDecoratorFunction,
+ 'decoratormethod': PyDecoratorMethod,
}
roles = {
'data': PyXRefRole(),
@@ -578,9 +608,8 @@ class PythonDomain(Domain):
del self.data['modules'][modname]
def find_obj(self, env, modname, classname, name, type, searchmode=0):
- """
- Find a Python object for "name", perhaps using the given module and/or
- classname. Returns a list of (name, object entry) tuples.
+ """Find a Python object for "name", perhaps using the given module
+ and/or classname. Returns a list of (name, object entry) tuples.
"""
# skip parens
if name[-2:] == '()':
diff --git a/sphinx/domains/rst.py b/sphinx/domains/rst.py
index 770a6f6a..9a40b05f 100644
--- a/sphinx/domains/rst.py
+++ b/sphinx/domains/rst.py
@@ -46,7 +46,7 @@ class ReSTMarkup(ObjectDescription):
indextext = self.get_index_text(self.objtype, name)
if indextext:
self.indexnode['entries'].append(('single', indextext,
- targetname, targetname))
+ targetname, ''))
def get_index_text(self, objectname, name):
if self.objtype == 'directive':
@@ -57,9 +57,10 @@ class ReSTMarkup(ObjectDescription):
def parse_directive(d):
- """
- Parses a directive signature. Returns (directive, arguments) string tuple.
- if no arguments are given, returns (directive, '').
+ """Parse a directive signature.
+
+ Returns (directive, arguments) string tuple. If no arguments are given,
+ returns (directive, '').
"""
dir = d.strip()
if not dir.startswith('.'):
diff --git a/sphinx/domains/std.py b/sphinx/domains/std.py
index 389134cc..890ea10f 100644
--- a/sphinx/domains/std.py
+++ b/sphinx/domains/std.py
@@ -14,6 +14,7 @@ import unicodedata
from docutils import nodes
from docutils.parsers.rst import directives
+from docutils.statemachine import ViewList
from sphinx import addnodes
from sphinx.roles import XRefRole
@@ -60,7 +61,7 @@ class GenericObject(ObjectDescription):
indextype = 'single'
indexentry = self.indextemplate % (name,)
self.indexnode['entries'].append((indextype, indexentry,
- targetname, targetname))
+ targetname, ''))
self.env.domaindata['std']['objects'][self.objtype, name] = \
self.env.docname, targetname
@@ -81,8 +82,8 @@ class EnvVarXRefRole(XRefRole):
tgtid = 'index-%s' % env.new_serialno('index')
indexnode = addnodes.index()
indexnode['entries'] = [
- ('single', varname, tgtid, varname),
- ('single', _('environment variable; %s') % varname, tgtid, varname)
+ ('single', varname, tgtid, ''),
+ ('single', _('environment variable; %s') % varname, tgtid, '')
]
targetnode = nodes.target('', '', ids=[tgtid])
document.note_explicit_target(targetnode)
@@ -117,7 +118,7 @@ class Target(Directive):
indextype = indexentry[:colon].strip()
indexentry = indexentry[colon+1:].strip()
inode = addnodes.index(entries=[(indextype, indexentry,
- targetname, targetname)])
+ targetname, '')])
ret.insert(0, inode)
name = self.name
if ':' in self.name:
@@ -160,7 +161,7 @@ class Cmdoption(ObjectDescription):
self.indexnode['entries'].append(
('pair', _('%scommand line option; %s') %
((currprogram and currprogram + ' ' or ''), sig),
- targetname, targetname))
+ targetname, ''))
self.env.domaindata['std']['progoptions'][currprogram, name] = \
self.env.docname, targetname
@@ -206,8 +207,8 @@ class OptionXRefRole(XRefRole):
class Glossary(Directive):
"""
- Directive to create a glossary with cross-reference targets
- for :term: roles.
+ Directive to create a glossary with cross-reference targets for :term:
+ roles.
"""
has_content = True
@@ -224,37 +225,100 @@ class Glossary(Directive):
gloss_entries = env.temp_data.setdefault('gloss_entries', set())
node = addnodes.glossary()
node.document = self.state.document
- self.state.nested_parse(self.content, self.content_offset, node)
-
- # the content should be definition lists
- dls = [child for child in node
- if isinstance(child, nodes.definition_list)]
- # now, extract definition terms to enable cross-reference creation
- new_dl = nodes.definition_list()
- new_dl['classes'].append('glossary')
+
+ # This directive implements a custom format of the reST definition list
+ # that allows multiple lines of terms before the definition. This is
+ # easy to parse since we know that the contents of the glossary *must
+ # be* a definition list.
+
+ # first, collect single entries
+ entries = []
+ in_definition = True
+ was_empty = True
+ messages = []
+ for line, (source, lineno) in zip(self.content, self.content.items):
+ # empty line -> add to last definition
+ if not line:
+ if in_definition and entries:
+ entries[-1][1].append('', source, lineno)
+ was_empty = True
+ continue
+ # unindented line -> a term
+ if line and not line[0].isspace():
+ # first term of definition
+ if in_definition:
+ if not was_empty:
+ messages.append(self.state.reporter.system_message(
+ 2, 'glossary term must be preceded by empty line',
+ source=source, line=lineno))
+ entries.append(([(line, source, lineno)], ViewList()))
+ in_definition = False
+ # second term and following
+ else:
+ if was_empty:
+ messages.append(self.state.reporter.system_message(
+ 2, 'glossary terms must not be separated by empty '
+ 'lines', source=source, line=lineno))
+ entries[-1][0].append((line, source, lineno))
+ else:
+ if not in_definition:
+ # first line of definition, determines indentation
+ in_definition = True
+ indent_len = len(line) - len(line.lstrip())
+ entries[-1][1].append(line[indent_len:], source, lineno)
+ was_empty = False
+
+ # now, parse all the entries into a big definition list
items = []
- for dl in dls:
- for li in dl.children:
- if not li.children or not isinstance(li[0], nodes.term):
- continue
- termtext = li.children[0].astext()
+ for terms, definition in entries:
+ termtexts = []
+ termnodes = []
+ system_messages = []
+ ids = []
+ for line, source, lineno in terms:
+ # parse the term with inline markup
+ res = self.state.inline_text(line, lineno)
+ system_messages.extend(res[1])
+
+ # get a text-only representation of the term and register it
+ # as a cross-reference target
+ tmp = nodes.paragraph('', '', *res[0])
+ termtext = tmp.astext()
new_id = 'term-' + nodes.make_id(termtext)
if new_id in gloss_entries:
new_id = 'term-' + str(len(gloss_entries))
gloss_entries.add(new_id)
- li[0]['names'].append(new_id)
- li[0]['ids'].append(new_id)
+ ids.append(new_id)
objects['term', termtext.lower()] = env.docname, new_id
+ termtexts.append(termtext)
# add an index entry too
indexnode = addnodes.index()
- indexnode['entries'] = [('single', termtext, new_id, termtext)]
- li.insert(0, indexnode)
- items.append((termtext, li))
+ indexnode['entries'] = [('single', termtext, new_id, 'main')]
+ termnodes.append(indexnode)
+ termnodes.extend(res[0])
+ termnodes.append(addnodes.termsep())
+ # make a single "term" node with all the terms, separated by termsep
+ # nodes (remove the dangling trailing separator)
+ term = nodes.term('', '', *termnodes[:-1])
+ term['ids'].extend(ids)
+ term['names'].extend(ids)
+ term += system_messages
+
+ defnode = nodes.definition()
+ self.state.nested_parse(definition, definition.items[0][1], defnode)
+
+ items.append((termtexts,
+ nodes.definition_list_item('', term, defnode)))
+
if 'sorted' in self.options:
- items.sort(key=lambda x: unicodedata.normalize('NFD', x[0].lower()))
- new_dl.extend(item[1] for item in items)
- node.children = [new_dl]
- return [node]
+ items.sort(key=lambda x:
+ unicodedata.normalize('NFD', x[0][0].lower()))
+
+ dlist = nodes.definition_list()
+ dlist['classes'].append('glossary')
+ dlist.extend(item[1] for item in items)
+ node += dlist
+ return messages + [node]
token_re = re.compile('`(\w+)`', re.U)
diff --git a/sphinx/environment.py b/sphinx/environment.py
index 465c8825..ae353ad4 100644
--- a/sphinx/environment.py
+++ b/sphinx/environment.py
@@ -11,6 +11,7 @@
import re
import os
+import sys
import time
import types
import codecs
@@ -25,9 +26,10 @@ from itertools import izip, groupby
from docutils import nodes
from docutils.io import FileInput, NullOutput
from docutils.core import Publisher
-from docutils.utils import Reporter, relative_path, get_source_line
+from docutils.utils import Reporter, relative_path, new_document, \
+ get_source_line
from docutils.readers import standalone
-from docutils.parsers.rst import roles, directives
+from docutils.parsers.rst import roles, directives, Parser as RSTParser
from docutils.parsers.rst.languages import en as english
from docutils.parsers.rst.directives.html import MetaBody
from docutils.writers import UnfilteredWriter
@@ -35,15 +37,19 @@ from docutils.transforms import Transform
from docutils.transforms.parts import ContentsFilter
from sphinx import addnodes
-from sphinx.util import url_re, get_matching_docs, docname_join, \
+from sphinx.util import url_re, get_matching_docs, docname_join, split_into, \
FilenameUniqDict
-from sphinx.util.nodes import clean_astext, make_refnode, WarningStream
-from sphinx.util.osutil import movefile, SEP, ustrftime
+from sphinx.util.nodes import clean_astext, make_refnode, extract_messages, \
+ WarningStream
+from sphinx.util.osutil import movefile, SEP, ustrftime, find_catalog
from sphinx.util.matching import compile_matchers
-from sphinx.util.pycompat import all
+from sphinx.util.pycompat import all, class_types
+from sphinx.util.websupport import is_commentable
from sphinx.errors import SphinxError, ExtensionError
-from sphinx.locale import _
+from sphinx.locale import _, init as init_locale
+from sphinx.versioning import add_uids, merge_doctrees
+fs_encoding = sys.getfilesystemencoding() or sys.getdefaultencoding()
orig_role_function = roles.role
orig_directive_function = directives.directive
@@ -64,7 +70,7 @@ default_settings = {
# This is increased every time an environment attribute is added
# or changed to properly invalidate pickle files.
-ENV_VERSION = 39
+ENV_VERSION = 41
default_substitutions = set([
@@ -75,6 +81,12 @@ default_substitutions = set([
dummy_reporter = Reporter('', 4, 4)
+versioning_conditions = {
+ 'none': False,
+ 'text': nodes.TextElement,
+ 'commentable': is_commentable,
+}
+
class NoUri(Exception):
"""Raised by get_relative_uri if there is no URI available."""
@@ -170,17 +182,58 @@ class CitationReferences(Transform):
for citnode in self.document.traverse(nodes.citation_reference):
cittext = citnode.astext()
refnode = addnodes.pending_xref(cittext, reftype='citation',
- reftarget=cittext)
+ reftarget=cittext, refwarn=True)
+ refnode.line = citnode.line or citnode.parent.line
refnode += nodes.Text('[' + cittext + ']')
citnode.parent.replace(citnode, refnode)
+class Locale(Transform):
+ """
+ Replace translatable nodes with their translated doctree.
+ """
+ default_priority = 0
+ def apply(self):
+ env = self.document.settings.env
+ settings, source = self.document.settings, self.document['source']
+ # XXX check if this is reliable
+ assert source.startswith(env.srcdir)
+ docname = path.splitext(path.relpath(source, env.srcdir))[0]
+ textdomain = find_catalog(docname,
+ self.document.settings.gettext_compact)
+
+ # fetch translations
+ dirs = [path.join(env.srcdir, directory)
+ for directory in env.config.locale_dirs]
+ catalog, has_catalog = init_locale(dirs, env.config.language,
+ textdomain)
+ if not has_catalog:
+ return
+
+ parser = RSTParser()
+
+ for node, msg in extract_messages(self.document):
+ patch = new_document(source, settings)
+ msgstr = catalog.gettext(msg)
+ # XXX add marker to untranslated parts
+ if not msgstr or msgstr == msg: # as-of-yet untranslated
+ continue
+ parser.parse(msgstr, patch)
+ patch = patch[0]
+ # XXX doctest and other block markup
+ if not isinstance(patch, nodes.paragraph):
+ continue # skip for now
+ for child in patch.children: # update leaves
+ child.parent = node
+ node.children = patch.children
+
+
class SphinxStandaloneReader(standalone.Reader):
"""
Add our own transforms.
"""
- transforms = [CitationReferences, DefaultSubstitutions, MoveModuleTargets,
- HandleCodeBlocks, SortIds]
+ transforms = [Locale, CitationReferences, DefaultSubstitutions,
+ MoveModuleTargets, HandleCodeBlocks, SortIds]
def get_transforms(self):
return standalone.Reader.get_transforms(self) + self.transforms
@@ -244,7 +297,7 @@ class BuildEnvironment:
if key.startswith('_') or \
isinstance(val, types.ModuleType) or \
isinstance(val, types.FunctionType) or \
- isinstance(val, (type, types.ClassType)):
+ isinstance(val, class_types):
del self.config[key]
try:
pickle.dump(self, picklefile, pickle.HIGHEST_PROTOCOL)
@@ -263,6 +316,9 @@ class BuildEnvironment:
self.srcdir = srcdir
self.config = config
+ # the method of doctree versioning; see set_versioning_method
+ self.versioning_condition = None
+
# the application object; only set while update() runs
self.app = None
@@ -279,6 +335,9 @@ class BuildEnvironment:
# this is to invalidate old pickles
self.version = ENV_VERSION
+ # make this a set for faster testing
+ self._nitpick_ignore = set(self.config.nitpick_ignore)
+
# All "docnames" here are /-separated and relative and exclude
# the source suffix.
@@ -330,6 +389,23 @@ class BuildEnvironment:
self._warnfunc = func
self.settings['warning_stream'] = WarningStream(func)
+ def set_versioning_method(self, method):
+ """This sets the doctree versioning method for this environment.
+
+ Versioning methods are a builder property; only builders with the same
+ versioning method can share the same doctree directory. Therefore, we
+ raise an exception if the user tries to use an environment with an
+ incompatible versioning method.
+ """
+ if method not in versioning_conditions:
+ raise ValueError('invalid versioning method: %r' % method)
+ condition = versioning_conditions[method]
+ if self.versioning_condition not in (None, condition):
+ raise SphinxError('This environment is incompatible with the '
+ 'selected builder, please choose another '
+ 'doctree directory.')
+ self.versioning_condition = condition
+
def warn(self, docname, msg, lineno=None):
# strange argument order is due to backwards compatibility
self._warnfunc(msg, (docname, lineno))
@@ -371,25 +447,46 @@ class BuildEnvironment:
domain.clear_doc(docname)
def doc2path(self, docname, base=True, suffix=None):
+ """Return the filename for the document name.
+
+ If *base* is True, return absolute path under self.srcdir.
+ If *base* is None, return relative path to self.srcdir.
+ If *base* is a path string, return absolute path under that.
+ If *suffix* is not None, add it instead of config.source_suffix.
"""
- Return the filename for the document name.
- If base is True, return absolute path under self.srcdir.
- If base is None, return relative path to self.srcdir.
- If base is a path string, return absolute path under that.
- If suffix is not None, add it instead of config.source_suffix.
- """
+ docname = docname.replace(SEP, path.sep)
suffix = suffix or self.config.source_suffix
if base is True:
- return path.join(self.srcdir,
- docname.replace(SEP, path.sep)) + suffix
+ return path.join(self.srcdir, docname) + suffix
elif base is None:
- return docname.replace(SEP, path.sep) + suffix
+ return docname + suffix
else:
- return path.join(base, docname.replace(SEP, path.sep)) + suffix
+ return path.join(base, docname) + suffix
- def find_files(self, config):
+ def relfn2path(self, filename, docname=None):
+ """Return paths to a file referenced from a document, relative to
+ documentation root and absolute.
+
+ Absolute filenames are relative to the source dir, while relative
+ filenames are relative to the dir of the containing document.
"""
- Find all source files in the source dir and put them in self.found_docs.
+ if filename.startswith('/') or filename.startswith(os.sep):
+ rel_fn = filename[1:]
+ else:
+ docdir = path.dirname(self.doc2path(docname or self.docname,
+ base=None))
+ rel_fn = path.join(docdir, filename)
+ try:
+ return rel_fn, path.join(self.srcdir, rel_fn)
+ except UnicodeDecodeError:
+ # the source directory is a bytestring with non-ASCII characters;
+ # let's try to encode the rel_fn in the file system encoding
+ enc_rel_fn = rel_fn.encode(sys.getfilesystemencoding())
+ return rel_fn, path.join(self.srcdir, enc_rel_fn)
+
+ def find_files(self, config):
+ """Find all source files in the source dir and put them in
+ self.found_docs.
"""
matchers = compile_matchers(
config.exclude_patterns[:] +
@@ -402,9 +499,7 @@ class BuildEnvironment:
self.srcdir, config.source_suffix, exclude_matchers=matchers))
def get_outdated_files(self, config_changed):
- """
- Return (added, changed, removed) sets.
- """
+ """Return (added, changed, removed) sets."""
# clear all files no longer present
removed = set(self.all_docs) - self.found_docs
@@ -454,12 +549,12 @@ class BuildEnvironment:
return added, changed, removed
def update(self, config, srcdir, doctreedir, app=None):
- """
- (Re-)read all files new or changed since last update. Returns a
- summary, the total count of documents to reread and an iterator that
- yields docnames as it processes them. Store all environment docnames in
- the canonical format (ie using SEP as a separator in place of
- os.path.sep).
+ """(Re-)read all files new or changed since last update.
+
+ Returns a summary, the total count of documents to reread and an
+ iterator that yields docnames as it processes them. Store all
+ environment docnames in the canonical format (ie using SEP as a
+ separator in place of os.path.sep).
"""
config_changed = False
if self.config is None:
@@ -490,6 +585,10 @@ class BuildEnvironment:
added, changed, removed = self.get_outdated_files(config_changed)
+ # allow user intervention as well
+ for docs in app.emit('env-get-outdated', self, added, changed, removed):
+ changed.update(set(docs) & self.found_docs)
+
# if files were added or removed, all documents with globbed toctrees
# must be reread
if added or removed:
@@ -590,8 +689,8 @@ class BuildEnvironment:
roles.role = role
def read_doc(self, docname, src_path=None, save_parsed=True, app=None):
- """
- Parse a file and add/update inventory entries for the doctree.
+ """Parse a file and add/update inventory entries for the doctree.
+
If srcpath is given, read from a different source file.
"""
# remove all inventory entries for that file
@@ -611,6 +710,7 @@ class BuildEnvironment:
self.settings['input_encoding'] = self.config.source_encoding
self.settings['trim_footnote_reference_space'] = \
self.config.trim_footnote_reference_space
+ self.settings['gettext_compact'] = self.config.gettext_compact
self.patch_lookup_functions()
@@ -632,6 +732,8 @@ class BuildEnvironment:
FileInput.__init__(self_, *args, **kwds)
def decode(self_, data):
+ if isinstance(data, unicode):
+ return data
return data.decode(self_.encoding, 'sphinx')
def read(self_):
@@ -653,7 +755,7 @@ class BuildEnvironment:
destination_class=NullOutput)
pub.set_components(None, 'restructuredtext', None)
pub.process_programmatic_settings(None, self.settings, None)
- pub.set_source(None, src_path)
+ pub.set_source(None, src_path.encode(fs_encoding))
pub.set_destination(None, None)
try:
pub.publish()
@@ -682,6 +784,25 @@ class BuildEnvironment:
# store time of build, for outdated files detection
self.all_docs[docname] = time.time()
+ if self.versioning_condition:
+ # get old doctree
+ try:
+ f = open(self.doc2path(docname,
+ self.doctreedir, '.doctree'), 'rb')
+ try:
+ old_doctree = pickle.load(f)
+ finally:
+ f.close()
+ except EnvironmentError:
+ old_doctree = None
+
+ # add uids for versioning
+ if old_doctree is None:
+ list(add_uids(doctree, self.versioning_condition))
+ else:
+ list(merge_doctrees(
+ old_doctree, doctree, self.versioning_condition))
+
# make it picklable
doctree.reporter = None
doctree.transformer = None
@@ -749,18 +870,15 @@ class BuildEnvironment:
# post-processing of read doctrees
def filter_messages(self, doctree):
- """
- Filter system messages from a doctree.
- """
+ """Filter system messages from a doctree."""
filterlevel = self.config.keep_warnings and 2 or 5
for node in doctree.traverse(nodes.system_message):
if node['level'] < filterlevel:
node.parent.remove(node)
+
def process_dependencies(self, docname, doctree):
- """
- Process docutils-generated dependency info.
- """
+ """Process docutils-generated dependency info."""
cwd = os.getcwd()
frompath = path.join(path.normpath(self.srcdir), 'dummy')
deps = doctree.settings.record_dependencies
@@ -774,30 +892,20 @@ class BuildEnvironment:
self.dependencies.setdefault(docname, set()).add(relpath)
def process_downloads(self, docname, doctree):
- """
- Process downloadable file paths.
- """
- docdir = path.dirname(self.doc2path(docname, base=None))
+ """Process downloadable file paths. """
for node in doctree.traverse(addnodes.download_reference):
targetname = node['reftarget']
- if targetname.startswith('/') or targetname.startswith(os.sep):
- # absolute
- filepath = targetname[1:]
- else:
- filepath = path.normpath(path.join(docdir, node['reftarget']))
- self.dependencies.setdefault(docname, set()).add(filepath)
- if not os.access(path.join(self.srcdir, filepath), os.R_OK):
- self.warn_node('download file not readable: %s' % filepath,
+ rel_filename, filename = self.relfn2path(targetname, docname)
+ self.dependencies.setdefault(docname, set()).add(rel_filename)
+ if not os.access(filename, os.R_OK):
+ self.warn_node('download file not readable: %s' % filename,
node)
continue
- uniquename = self.dlfiles.add_file(docname, filepath)
+ uniquename = self.dlfiles.add_file(docname, filename)
node['filename'] = uniquename
def process_images(self, docname, doctree):
- """
- Process and rewrite image URIs.
- """
- docdir = path.dirname(self.doc2path(docname, base=None))
+ """Process and rewrite image URIs."""
for node in doctree.traverse(nodes.image):
# Map the mimetype to the corresponding image. The writer may
# choose the best image from these candidates. The special key * is
@@ -809,16 +917,11 @@ class BuildEnvironment:
self.warn_node('nonlocal image URI found: %s' % imguri, node)
candidates['?'] = imguri
continue
- # imgpath is the image path *from srcdir*
- 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))
+ rel_imgpath, full_imgpath = self.relfn2path(imguri, docname)
# set imgpath as default URI
- node['uri'] = imgpath
- if imgpath.endswith(os.extsep + '*'):
- for filename in glob(path.join(self.srcdir, imgpath)):
+ node['uri'] = rel_imgpath
+ if rel_imgpath.endswith(os.extsep + '*'):
+ for filename in glob(full_imgpath):
new_imgpath = relative_path(self.srcdir, filename)
if filename.lower().endswith('.pdf'):
candidates['application/pdf'] = new_imgpath
@@ -837,7 +940,7 @@ class BuildEnvironment:
if imgtype:
candidates['image/' + imgtype] = new_imgpath
else:
- candidates['*'] = imgpath
+ candidates['*'] = rel_imgpath
# map image paths to unique image names (so that they can be put
# into a single directory)
for imgpath in candidates.itervalues():
@@ -849,8 +952,8 @@ class BuildEnvironment:
self.images.add_file(docname, imgpath)
def process_metadata(self, docname, doctree):
- """
- Process the docinfo part of the doctree as metadata.
+ """Process the docinfo part of the doctree as metadata.
+
Keep processing minimal -- just return what docutils says.
"""
self.metadata[docname] = md = {}
@@ -935,8 +1038,7 @@ class BuildEnvironment:
item.replace(para, compact_para)
def create_title_from(self, docname, document):
- """
- Add a title node to the document (just copy the first section title),
+ """Add a title node to the document (just copy the first section title),
and store that title in the environment.
"""
titlenode = nodes.title()
@@ -974,7 +1076,8 @@ class BuildEnvironment:
def note_toctree(self, docname, toctreenode):
"""Note a TOC tree directive in a document and gather information about
- file relations from it."""
+ file relations from it.
+ """
if toctreenode['glob']:
self.glob_toctrees.add(docname)
if toctreenode.get('numbered'):
@@ -1012,6 +1115,12 @@ class BuildEnvironment:
# 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 isinstance(sectionnode, addnodes.only):
+ onlynode = addnodes.only(expr=sectionnode['expr'])
+ blist = build_toc(sectionnode, depth)
+ if blist:
+ onlynode += blist.children
+ entries.append(onlynode)
if not isinstance(sectionnode, nodes.section):
for toctreenode in traverse_in_section(sectionnode,
addnodes.toctree):
@@ -1033,6 +1142,8 @@ class BuildEnvironment:
else:
anchorname = '#' + sectionnode['ids'][0]
numentries[0] += 1
+ # make these nodes:
+ # list_item -> compact_paragraph -> reference
reference = nodes.reference(
'', '', internal=True, refuri=docname,
anchorname=anchorname, *nodetext)
@@ -1051,9 +1162,10 @@ class BuildEnvironment:
self.tocs[docname] = nodes.bullet_list('')
self.toc_num_entries[docname] = numentries[0]
- def get_toc_for(self, docname):
+ def get_toc_for(self, docname, builder):
"""Return a TOC nodetree -- for use on the same page only!"""
toc = self.tocs[docname].deepcopy()
+ self.process_only_nodes(toc, builder, docname)
for node in toc.traverse(nodes.reference):
node['refuri'] = node['anchorname'] or '#'
return toc
@@ -1080,7 +1192,9 @@ class BuildEnvironment:
def get_domain(self, domainname):
"""Return the domain instance with the specified name.
- Raises an ExtensionError if the domain is not registered."""
+
+ Raises an ExtensionError if the domain is not registered.
+ """
try:
return self.domains[domainname]
except KeyError:
@@ -1105,7 +1219,8 @@ class BuildEnvironment:
def get_and_resolve_doctree(self, docname, builder, doctree=None,
prune_toctrees=True):
"""Read the doctree from the pickle, resolve cross-references and
- toctrees and return it."""
+ toctrees and return it.
+ """
if doctree is None:
doctree = self.get_doctree(docname)
@@ -1125,8 +1240,7 @@ class BuildEnvironment:
def resolve_toctree(self, docname, builder, toctree, prune=True, maxdepth=0,
titles_only=False, collapse=False, includehidden=False):
- """
- Resolve a *toctree* node into individual bullet lists with titles
+ """Resolve a *toctree* node into individual bullet lists with titles
as items, returning None (if no containing titles are found) or
a new node.
@@ -1228,6 +1342,7 @@ class BuildEnvironment:
toc = nodes.bullet_list('', item)
else:
toc = self.tocs[ref].deepcopy()
+ self.process_only_nodes(toc, builder, ref)
if title and toc.children and len(toc.children) == 1:
child = toc.children[0]
for refnode in child.traverse(nodes.reference):
@@ -1258,12 +1373,14 @@ class BuildEnvironment:
toplevel[1][:] = subtrees
# resolve all sub-toctrees
for toctreenode in toc.traverse(addnodes.toctree):
- i = toctreenode.parent.index(toctreenode) + 1
- for item in _entries_from_toctree(toctreenode,
- subtree=True):
- toctreenode.parent.insert(i, item)
- i += 1
- toctreenode.parent.remove(toctreenode)
+ if not (toctreenode.get('hidden', False)
+ and not includehidden):
+ i = toctreenode.parent.index(toctreenode) + 1
+ for item in _entries_from_toctree(toctreenode,
+ subtree=True):
+ toctreenode.parent.insert(i, item)
+ i += 1
+ toctreenode.parent.remove(toctreenode)
if separate:
entries.append(toc)
else:
@@ -1307,7 +1424,6 @@ class BuildEnvironment:
typ = node['reftype']
target = node['reftarget']
refdoc = node.get('refdoc', fromdocname)
- warned = False
domain = None
try:
@@ -1324,10 +1440,7 @@ class BuildEnvironment:
# directly reference to document by source name;
# can be absolute or relative
docname = docname_join(refdoc, target)
- if docname not in self.all_docs:
- self.warn_node('unknown document: %s' % docname, node)
- warned = True
- else:
+ if docname in self.all_docs:
if node['refexplicit']:
# reference with explicit title
caption = node.astext()
@@ -1340,10 +1453,7 @@ class BuildEnvironment:
newnode.append(innernode)
elif typ == 'citation':
docname, labelid = self.citations.get(target, ('', ''))
- if not docname:
- self.warn_node('citation not found: %s' % target, node)
- warned = True
- else:
+ if docname:
newnode = make_refnode(builder, fromdocname, docname,
labelid, contnode)
# no new node found? try the missing-reference event
@@ -1351,21 +1461,43 @@ class BuildEnvironment:
newnode = builder.app.emit_firstresult(
'missing-reference', self, node, contnode)
# still not found? warn if in nit-picky mode
- if newnode is None and not warned and \
- (self.config.nitpicky or node.get('refwarn')):
- if domain and typ in domain.dangling_warnings:
- msg = domain.dangling_warnings[typ]
- elif node.get('refdomain') != 'std':
- msg = '%s:%s reference target not found: ' \
- '%%(target)s' % (node['refdomain'], typ)
- else:
- msg = '%s reference target not found: ' \
- '%%(target)s' % typ
- self.warn_node(msg % {'target': target}, node)
+ if newnode is None:
+ self._warn_missing_reference(
+ fromdocname, typ, target, node, domain)
except NoUri:
newnode = contnode
node.replace_self(newnode or contnode)
+ # remove only-nodes that do not belong to our builder
+ self.process_only_nodes(doctree, builder, fromdocname)
+
+ # allow custom references to be resolved
+ builder.app.emit('doctree-resolved', doctree, fromdocname)
+
+ def _warn_missing_reference(self, fromdoc, typ, target, node, domain):
+ warn = node.get('refwarn')
+ if self.config.nitpicky:
+ warn = True
+ if self._nitpick_ignore:
+ dtype = domain and '%s:%s' % (domain.name, typ) or typ
+ if (dtype, target) in self._nitpick_ignore:
+ warn = False
+ if not warn:
+ return
+ if domain and typ in domain.dangling_warnings:
+ msg = domain.dangling_warnings[typ]
+ elif typ == 'doc':
+ msg = 'unknown document: %(target)s'
+ elif typ == 'citation':
+ msg = 'citation not found: %(target)s'
+ elif node.get('refdomain', 'std') != 'std':
+ msg = '%s:%s reference target not found: %%(target)s' % \
+ (node['refdomain'], typ)
+ else:
+ msg = '%s reference target not found: %%(target)s' % typ
+ self.warn_node(msg % {'target': target}, node)
+
+ def process_only_nodes(self, doctree, builder, fromdocname=None):
for node in doctree.traverse(addnodes.only):
try:
ret = builder.tags.eval_condition(node['expr'])
@@ -1381,9 +1513,6 @@ class BuildEnvironment:
# if there is a target node before the only node
node.replace_self(nodes.comment())
- # allow custom references to be resolved
- builder.app.emit('doctree-resolved', doctree, fromdocname)
-
def assign_section_numbers(self):
"""Assign a section number to each heading under a numbered toctree."""
# a list of all docnames whose section numbers changed
@@ -1392,46 +1521,60 @@ class BuildEnvironment:
old_secnumbers = self.toc_secnumbers
self.toc_secnumbers = {}
- def _walk_toc(node, secnums, titlenode=None):
+ def _walk_toc(node, secnums, depth, titlenode=None):
# titlenode is the title of the document, it will get assigned a
# secnumber too, so that it shows up in next/prev/parent rellinks
for subnode in node.children:
if isinstance(subnode, nodes.bullet_list):
numstack.append(0)
- _walk_toc(subnode, secnums, titlenode)
+ _walk_toc(subnode, secnums, depth-1, titlenode)
numstack.pop()
titlenode = None
elif isinstance(subnode, nodes.list_item):
- _walk_toc(subnode, secnums, titlenode)
+ _walk_toc(subnode, secnums, depth, titlenode)
+ titlenode = None
+ elif isinstance(subnode, addnodes.only):
+ # at this stage we don't know yet which sections are going
+ # to be included; just include all of them, even if it leads
+ # to gaps in the numbering
+ _walk_toc(subnode, secnums, depth, titlenode)
titlenode = None
elif isinstance(subnode, addnodes.compact_paragraph):
numstack[-1] += 1
+ if depth > 0:
+ number = tuple(numstack)
+ else:
+ number = None
secnums[subnode[0]['anchorname']] = \
- subnode[0]['secnumber'] = tuple(numstack)
+ subnode[0]['secnumber'] = number
if titlenode:
- titlenode['secnumber'] = tuple(numstack)
+ titlenode['secnumber'] = number
titlenode = None
elif isinstance(subnode, addnodes.toctree):
- _walk_toctree(subnode)
+ _walk_toctree(subnode, depth)
- def _walk_toctree(toctreenode):
+ def _walk_toctree(toctreenode, depth):
+ if depth == 0:
+ return
for (title, ref) in toctreenode['entries']:
if url_re.match(ref) or ref == 'self':
# don't mess with those
continue
if ref in self.tocs:
secnums = self.toc_secnumbers[ref] = {}
- _walk_toc(self.tocs[ref], secnums, self.titles.get(ref))
+ _walk_toc(self.tocs[ref], secnums, depth,
+ self.titles.get(ref))
if secnums != old_secnumbers.get(ref):
rewrite_needed.append(ref)
for docname in self.numbered_toctrees:
doctree = self.get_doctree(docname)
for toctreenode in doctree.traverse(addnodes.toctree):
- if toctreenode.get('numbered'):
+ depth = toctreenode.get('numbered', 0)
+ if depth:
# every numbered toctree gets new numbering
numstack = [0]
- _walk_toctree(toctreenode)
+ _walk_toctree(toctreenode, depth)
return rewrite_needed
@@ -1440,56 +1583,50 @@ class BuildEnvironment:
"""Create the real index from the collected index entries."""
new = {}
- def add_entry(word, subword, dic=new):
+ def add_entry(word, subword, link=True, dic=new):
entry = dic.get(word)
if not entry:
dic[word] = entry = [[], {}]
if subword:
- add_entry(subword, '', dic=entry[1])
- else:
+ add_entry(subword, '', link=link, dic=entry[1])
+ elif link:
try:
- entry[0].append(builder.get_relative_uri('genindex', fn)
- + '#' + tid)
+ uri = builder.get_relative_uri('genindex', fn) + '#' + tid
except NoUri:
pass
+ else:
+ entry[0].append((main, uri))
for fn, entries in self.indexentries.iteritems():
# new entry types must be listed in directives/other.py!
- for type, value, tid, alias in entries:
- if type == 'single':
- try:
- entry, subentry = value.split(';', 1)
- except ValueError:
- entry, subentry = value, ''
- if not entry:
- self.warn(fn, 'invalid index entry %r' % value)
- continue
- add_entry(entry.strip(), subentry.strip())
- elif type == 'pair':
- try:
- first, second = map(lambda x: x.strip(),
- value.split(';', 1))
- if not first or not second:
- raise ValueError
- except ValueError:
- self.warn(fn, 'invalid pair index entry %r' % value)
- continue
- add_entry(first, second)
- add_entry(second, first)
- elif type == 'triple':
- try:
- first, second, third = map(lambda x: x.strip(),
- value.split(';', 2))
- if not first or not second or not third:
- raise ValueError
- except ValueError:
- self.warn(fn, 'invalid triple index entry %r' % value)
- continue
- add_entry(first, second+' '+third)
- add_entry(second, third+', '+first)
- add_entry(third, first+' '+second)
- else:
- self.warn(fn, 'unknown index entry type %r' % type)
+ for type, value, tid, main in entries:
+ try:
+ if type == 'single':
+ try:
+ entry, subentry = split_into(2, 'single', value)
+ except ValueError:
+ entry, = split_into(1, 'single', value)
+ subentry = ''
+ add_entry(entry, subentry)
+ elif type == 'pair':
+ first, second = split_into(2, 'pair', value)
+ add_entry(first, second)
+ add_entry(second, first)
+ elif type == 'triple':
+ first, second, third = split_into(3, 'triple', value)
+ add_entry(first, second+' '+third)
+ add_entry(second, third+', '+first)
+ add_entry(third, first+' '+second)
+ elif type == 'see':
+ first, second = split_into(2, 'see', value)
+ add_entry(first, _('see %s') % second, link=False)
+ elif type == 'seealso':
+ first, second = split_into(2, 'see', value)
+ add_entry(first, _('see also %s') % second, link=False)
+ else:
+ self.warn(fn, 'unknown index entry type %r' % type)
+ except ValueError, err:
+ self.warn(fn, str(err))
# sort the index entries; put all symbols at the front, even those
# following the letters in ASCII, this is where the chr(127) comes from
@@ -1532,8 +1669,9 @@ class BuildEnvironment:
i += 1
# group the entries by letter
- def keyfunc2((k, v), letters=string.ascii_uppercase + '_'):
+ def keyfunc2(item, letters=string.ascii_uppercase + '_'):
# hack: mutating the subitems dicts to a list in the keyfunc
+ k, v = item
v[1] = sorted((si, se) for (si, (se, void)) in v[1].iteritems())
# now calculate the key
letter = unicodedata.normalize('NFD', k[0])[0].upper()
@@ -1592,7 +1730,6 @@ class BuildEnvironment:
def check_consistency(self):
"""Do consistency checks."""
-
for docname in sorted(self.all_docs):
if docname not in self.files_to_rebuild:
if docname == self.config.master_doc:
@@ -1601,3 +1738,4 @@ class BuildEnvironment:
if 'orphan' in self.metadata[docname]:
continue
self.warn(docname, 'document isn\'t included in any toctree')
+
diff --git a/sphinx/ext/autodoc.py b/sphinx/ext/autodoc.py
index f72e7dfa..f19334a0 100644
--- a/sphinx/ext/autodoc.py
+++ b/sphinx/ext/autodoc.py
@@ -15,7 +15,7 @@ import re
import sys
import inspect
import traceback
-from types import FunctionType, BuiltinFunctionType, MethodType, ClassType
+from types import FunctionType, BuiltinFunctionType, MethodType
from docutils import nodes
from docutils.utils import assemble_option_dict
@@ -27,16 +27,12 @@ from sphinx.pycode import ModuleAnalyzer, PycodeError
from sphinx.application import ExtensionError
from sphinx.util.nodes import nested_parse_with_titles
from sphinx.util.compat import Directive
-from sphinx.util.inspect import isdescriptor, safe_getmembers, safe_getattr
+from sphinx.util.inspect import getargspec, isdescriptor, safe_getmembers, \
+ safe_getattr, safe_repr
+from sphinx.util.pycompat import base_exception, class_types
from sphinx.util.docstrings import prepare_docstring
-try:
- base_exception = BaseException
-except NameError:
- base_exception = Exception
-
-
#: extended signature RE: with explicit module name separated by ::
py_ext_sig_re = re.compile(
r'''^ ([\w.]+::)? # explicit module name
@@ -91,7 +87,8 @@ def members_set_option(arg):
def bool_option(arg):
"""Used to convert flag options to auto directives. (Instead of
- directives.flag(), which returns None.)"""
+ directives.flag(), which returns None).
+ """
return True
@@ -139,8 +136,7 @@ class AutodocReporter(object):
# Some useful event listener factories for autodoc-process-docstring.
def cut_lines(pre, post=0, what=None):
- """
- Return a listener that removes the first *pre* and last *post*
+ """Return a listener that removes the first *pre* and last *post*
lines of every docstring. If *what* is a sequence of strings,
only docstrings of a type in *what* will be processed.
@@ -166,9 +162,8 @@ def cut_lines(pre, post=0, what=None):
return process
def between(marker, what=None, keepempty=False, exclude=False):
- """
- Return a listener that either keeps, or if *exclude* is True excludes, lines
- between lines that match the *marker* regular expression. If no line
+ """Return a listener that either keeps, or if *exclude* is True excludes,
+ lines between lines that match the *marker* regular expression. If no line
matches, the resulting docstring would be empty, so no change will be made
unless *keepempty* is true.
@@ -270,8 +265,7 @@ class Documenter(object):
self.directive.result.append(self.indent + line, source, *lineno)
def resolve_name(self, modname, parents, path, base):
- """
- Resolve the module and name of the object to document given by the
+ """Resolve the module and name of the object to document given by the
arguments and the current module/class.
Must return a pair of the module name and a chain of attributes; for
@@ -281,8 +275,7 @@ class Documenter(object):
raise NotImplementedError('must be implemented in subclasses')
def parse_name(self):
- """
- Determine what module to import and what attribute to document.
+ """Determine what module to import and what attribute to document.
Returns True and sets *self.modname*, *self.objpath*, *self.fullname*,
*self.args* and *self.retann* if parsing and resolving was successful.
@@ -319,8 +312,7 @@ class Documenter(object):
return True
def import_object(self):
- """
- Import the object given by *self.modname* and *self.objpath* and sets
+ """Import the object given by *self.modname* and *self.objpath* and set
it as *self.object*.
Returns True if successful, False if an error occurred.
@@ -349,15 +341,15 @@ class Documenter(object):
return False
def get_real_modname(self):
- """
- Get the real module name of an object to document. (It can differ
- from the name of the module through which the object was imported.)
+ """Get the real module name of an object to document.
+
+ It can differ from the name of the module through which the object was
+ imported.
"""
return self.get_attr(self.object, '__module__', None) or self.modname
def check_module(self):
- """
- Check if *self.object* is really defined in the module given by
+ """Check if *self.object* is really defined in the module given by
*self.modname*.
"""
modname = self.get_attr(self.object, '__module__', None)
@@ -366,25 +358,26 @@ class Documenter(object):
return True
def format_args(self):
- """
- Format the argument signature of *self.object*. Should return None if
- the object does not have a signature.
+ """Format the argument signature of *self.object*.
+
+ Should return None if the object does not have a signature.
"""
return None
def format_name(self):
- """
- Format the name of *self.object*. This normally should be something
- that can be parsed by the generated directive, but doesn't need to be
- (Sphinx will display it unparsed then).
+ """Format the name of *self.object*.
+
+ This normally should be something that can be parsed by the generated
+ directive, but doesn't need to be (Sphinx will display it unparsed
+ then).
"""
# normally the name doesn't contain the module (except for module
# directives of course)
return '.'.join(self.objpath) or self.modname
def format_signature(self):
- """
- Format the signature (arguments and return annotation) of the object.
+ """Format the signature (arguments and return annotation) of the object.
+
Let the user process it via the ``autodoc-process-signature`` event.
"""
if self.args is not None:
@@ -426,13 +419,16 @@ class Documenter(object):
# etc. don't support a prepended module name
self.add_line(u' :module: %s' % self.modname, '<autodoc>')
- def get_doc(self, encoding=None):
+ def get_doc(self, encoding=None, ignore=1):
"""Decode and return lines of the docstring(s) for the object."""
docstring = self.get_attr(self.object, '__doc__', None)
- if docstring:
- # make sure we have Unicode docstrings, then sanitize and split
- # into lines
- return [prepare_docstring(force_decode(docstring, encoding))]
+ # make sure we have Unicode docstrings, then sanitize and split
+ # into lines
+ if isinstance(docstring, unicode):
+ return [prepare_docstring(docstring, ignore)]
+ elif docstring:
+ return [prepare_docstring(force_decode(docstring, encoding),
+ ignore)]
return []
def process_doc(self, docstrings):
@@ -451,8 +447,11 @@ class Documenter(object):
# set sourcename and add content from attribute documentation
if self.analyzer:
# prevent encoding errors when the file name is non-ASCII
- filename = unicode(self.analyzer.srcname,
- sys.getfilesystemencoding(), 'replace')
+ if not isinstance(self.analyzer.srcname, unicode):
+ filename = unicode(self.analyzer.srcname,
+ sys.getfilesystemencoding(), 'replace')
+ else:
+ filename = self.analyzer.srcname
sourcename = u'%s:docstring of %s' % (filename, self.fullname)
attr_docs = self.analyzer.find_attr_docs()
@@ -484,8 +483,7 @@ class Documenter(object):
self.add_line(line, src[0], src[1])
def get_object_members(self, want_all):
- """
- Return `(members_check_module, members)` where `members` is a
+ """Return `(members_check_module, members)` where `members` is a
list of `(membername, member)` pairs of the members of *self.object*.
If *want_all* is True, return all members. Else, only return those
@@ -529,11 +527,15 @@ class Documenter(object):
return False, sorted(members)
def filter_members(self, members, want_all):
- """
- Filter the given member list: members are skipped if
+ """Filter the given member list.
- - they are private (except if given explicitly)
- - they are undocumented (except if undoc-members is given)
+ Members are skipped if
+
+ - they are private (except if given explicitly or the private-members
+ option is set)
+ - they are special methods (except if given explicitly or the
+ special-members option is set)
+ - they are undocumented (except if the undoc-members option is set)
The user can override the skipping decision by connecting to the
``autodoc-skip-member`` event.
@@ -553,18 +555,33 @@ class Documenter(object):
# if isattr is True, the member is documented as an attribute
isattr = False
- if want_all and membername.startswith('_'):
+ doc = self.get_attr(member, '__doc__', None)
+ # if the member __doc__ is the same as self's __doc__, it's just
+ # inherited and therefore not the member's doc
+ cls = self.get_attr(member, '__class__', None)
+ if cls:
+ cls_doc = self.get_attr(cls, '__doc__', None)
+ if cls_doc == doc:
+ doc = None
+ has_doc = bool(doc)
+
+ keep = False
+ if want_all and membername.startswith('__') and \
+ membername.endswith('__') and len(membername) > 4:
+ # special __methods__
+ if self.options.special_members and membername != '__doc__':
+ keep = has_doc or self.options.undoc_members
+ elif want_all and membername.startswith('_'):
# ignore members whose name starts with _ by default
- skip = True
+ keep = self.options.private_members and \
+ (has_doc or self.options.undoc_members)
elif (namespace, membername) in attr_docs:
# keep documented attributes
- skip = False
+ keep = True
isattr = True
else:
- # ignore undocumented members if :undoc-members:
- # is not given
- doc = self.get_attr(member, '__doc__', None)
- skip = not self.options.undoc_members and not doc
+ # ignore undocumented members if :undoc-members: is not given
+ keep = has_doc or self.options.undoc_members
# give the user a chance to decide whether this member
# should be skipped
@@ -572,20 +589,20 @@ class Documenter(object):
# let extensions preprocess docstrings
skip_user = self.env.app.emit_firstresult(
'autodoc-skip-member', self.objtype, membername, member,
- skip, self.options)
+ not keep, self.options)
if skip_user is not None:
- skip = skip_user
- if skip:
- continue
+ keep = not skip_user
- ret.append((membername, member, isattr))
+ if keep:
+ ret.append((membername, member, isattr))
return ret
def document_members(self, all_members=False):
- """
- Generate reST for member documentation. If *all_members* is True,
- do all members, else those given by *self.options.members*.
+ """Generate reST for member documentation.
+
+ If *all_members* is True, do all members, else those given by
+ *self.options.members*.
"""
# set current namespace for finding members
self.env.temp_data['autodoc:module'] = self.modname
@@ -643,8 +660,8 @@ class Documenter(object):
def generate(self, more_content=None, real_modname=None,
check_module=False, all_members=False):
- """
- Generate reST for the object given by *self.name*, and possibly members.
+ """Generate reST for the object given by *self.name*, and possibly for
+ its members.
If *more_content* is given, include that content. If *real_modname* is
given, use that module name to find attribute docs. If *check_module* is
@@ -727,6 +744,7 @@ class ModuleDocumenter(Documenter):
'show-inheritance': bool_option, 'synopsis': identity,
'platform': identity, 'deprecated': bool_option,
'member-order': identity, 'exclude-members': members_set_option,
+ 'private-members': bool_option, 'special-members': bool_option,
}
@classmethod
@@ -833,7 +851,53 @@ class ClassLevelDocumenter(Documenter):
return modname, parents + [base]
-class FunctionDocumenter(ModuleLevelDocumenter):
+class DocstringSignatureMixin(object):
+ """
+ Mixin for FunctionDocumenter and MethodDocumenter to provide the
+ feature of reading the signature from the docstring.
+ """
+
+ def _find_signature(self, encoding=None):
+ docstrings = Documenter.get_doc(self, encoding, 2)
+ if len(docstrings) != 1:
+ return
+ doclines = docstrings[0]
+ setattr(self, '__new_doclines', doclines)
+ if not doclines:
+ return
+ # match first line of docstring against signature RE
+ match = py_ext_sig_re.match(doclines[0])
+ if not match:
+ return
+ exmod, path, base, args, retann = match.groups()
+ # the base name must match ours
+ if not self.objpath or base != self.objpath[-1]:
+ return
+ # ok, now jump over remaining empty lines and set the remaining
+ # lines as the new doclines
+ i = 1
+ while i < len(doclines) and not doclines[i].strip():
+ i += 1
+ setattr(self, '__new_doclines', doclines[i:])
+ return args, retann
+
+ def get_doc(self, encoding=None, ignore=1):
+ lines = getattr(self, '__new_doclines', None)
+ if lines is not None:
+ return [lines]
+ return Documenter.get_doc(self, encoding, ignore)
+
+ def format_signature(self):
+ if self.args is None and self.env.config.autodoc_docstring_signature:
+ # only act if a signature is not explicitly given already, and if
+ # the feature is enabled
+ result = self._find_signature()
+ if result is not None:
+ self.args, self.retann = result
+ return Documenter.format_signature(self)
+
+
+class FunctionDocumenter(DocstringSignatureMixin, ModuleLevelDocumenter):
"""
Specialized Documenter subclass for functions.
"""
@@ -847,18 +911,18 @@ class FunctionDocumenter(ModuleLevelDocumenter):
def format_args(self):
if inspect.isbuiltin(self.object) or \
inspect.ismethoddescriptor(self.object):
- # can never get arguments of a C function or method
+ # cannot introspect arguments of a C function or method
return None
try:
- argspec = inspect.getargspec(self.object)
+ argspec = getargspec(self.object)
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(self.object.__new__)
+ argspec = getargspec(self.object.__new__)
except TypeError:
- argspec = inspect.getargspec(self.object.__init__)
+ argspec = getargspec(self.object.__init__)
if argspec[0]:
del argspec[0][0]
args = inspect.formatargspec(*argspec)
@@ -881,11 +945,12 @@ class ClassDocumenter(ModuleLevelDocumenter):
'noindex': bool_option, 'inherited-members': bool_option,
'show-inheritance': bool_option, 'member-order': identity,
'exclude-members': members_set_option,
+ 'private-members': bool_option, 'special-members': bool_option,
}
@classmethod
def can_document_member(cls, member, membername, isattr, parent):
- return isinstance(member, (type, ClassType))
+ return isinstance(member, class_types)
def import_object(self):
ret = ModuleLevelDocumenter.import_object(self)
@@ -907,7 +972,7 @@ class ClassDocumenter(ModuleLevelDocumenter):
(inspect.ismethod(initmeth) or inspect.isfunction(initmeth)):
return None
try:
- argspec = inspect.getargspec(initmeth)
+ argspec = getargspec(initmeth)
except TypeError:
# still not possible: happens e.g. for old-style classes
# with __init__ in C
@@ -937,7 +1002,7 @@ class ClassDocumenter(ModuleLevelDocumenter):
self.add_line(_(u' Bases: %s') % ', '.join(bases),
'<autodoc>')
- def get_doc(self, encoding=None):
+ def get_doc(self, encoding=None, ignore=1):
content = self.env.config.autoclass_content
docstrings = []
@@ -958,9 +1023,12 @@ class ClassDocumenter(ModuleLevelDocumenter):
docstrings = [initdocstring]
else:
docstrings.append(initdocstring)
-
- return [prepare_docstring(force_decode(docstring, encoding))
- for docstring in docstrings]
+ doc = []
+ for docstring in docstrings:
+ if not isinstance(docstring, unicode):
+ docstring = force_decode(docstring, encoding)
+ doc.append(prepare_docstring(docstring))
+ return doc
def add_content(self, more_content, no_docstring=False):
if self.doc_as_attr:
@@ -991,7 +1059,7 @@ class ExceptionDocumenter(ClassDocumenter):
@classmethod
def can_document_member(cls, member, membername, isattr, parent):
- return isinstance(member, (type, ClassType)) and \
+ return isinstance(member, class_types) and \
issubclass(member, base_exception)
@@ -1001,16 +1069,26 @@ class DataDocumenter(ModuleLevelDocumenter):
"""
objtype = 'data'
member_order = 40
+ priority = -10
@classmethod
def can_document_member(cls, member, membername, isattr, parent):
return isinstance(parent, ModuleDocumenter) and isattr
+ def add_directive_header(self, sig):
+ ModuleLevelDocumenter.add_directive_header(self, sig)
+ try:
+ objrepr = safe_repr(self.object)
+ except ValueError:
+ pass
+ else:
+ self.add_line(u' :annotation: = ' + objrepr, '<autodoc>')
+
def document_members(self, all_members=False):
pass
-class MethodDocumenter(ClassLevelDocumenter):
+class MethodDocumenter(DocstringSignatureMixin, ClassLevelDocumenter):
"""
Specialized Documenter subclass for methods (normal, static and class).
"""
@@ -1023,31 +1101,45 @@ class MethodDocumenter(ClassLevelDocumenter):
return inspect.isroutine(member) and \
not isinstance(parent, ModuleDocumenter)
- def import_object(self):
- ret = ClassLevelDocumenter.import_object(self)
- if isinstance(self.object, classmethod) or \
- (isinstance(self.object, MethodType) and
- self.object.im_self is not None):
- self.directivetype = 'classmethod'
- # document class and static members before ordinary ones
- self.member_order = self.member_order - 1
- elif isinstance(self.object, FunctionType) or \
- (isinstance(self.object, BuiltinFunctionType) and
- hasattr(self.object, '__self__') and
- self.object.__self__ is not None):
- self.directivetype = 'staticmethod'
- # document class and static members before ordinary ones
- self.member_order = self.member_order - 1
- else:
- self.directivetype = 'method'
- return ret
+ if sys.version_info >= (3, 0):
+ def import_object(self):
+ ret = ClassLevelDocumenter.import_object(self)
+ obj_from_parent = self.parent.__dict__.get(self.object_name)
+ if isinstance(obj_from_parent, classmethod):
+ self.directivetype = 'classmethod'
+ self.member_order = self.member_order - 1
+ elif isinstance(obj_from_parent, staticmethod):
+ self.directivetype = 'staticmethod'
+ self.member_order = self.member_order - 1
+ else:
+ self.directivetype = 'method'
+ return ret
+ else:
+ def import_object(self):
+ ret = ClassLevelDocumenter.import_object(self)
+ if isinstance(self.object, classmethod) or \
+ (isinstance(self.object, MethodType) and
+ self.object.im_self is not None):
+ self.directivetype = 'classmethod'
+ # document class and static members before ordinary ones
+ self.member_order = self.member_order - 1
+ elif isinstance(self.object, FunctionType) or \
+ (isinstance(self.object, BuiltinFunctionType) and
+ hasattr(self.object, '__self__') and
+ self.object.__self__ is not None):
+ self.directivetype = 'staticmethod'
+ # document class and static members before ordinary ones
+ self.member_order = self.member_order - 1
+ else:
+ self.directivetype = 'method'
+ return ret
def format_args(self):
if inspect.isbuiltin(self.object) or \
inspect.ismethoddescriptor(self.object):
# can never get arguments of a C function or method
return None
- argspec = inspect.getargspec(self.object)
+ argspec = getargspec(self.object)
if argspec[0] and argspec[0][0] in ('cls', 'self'):
del argspec[0][0]
return inspect.formatargspec(*argspec)
@@ -1074,16 +1166,44 @@ class AttributeDocumenter(ClassLevelDocumenter):
isdatadesc = isdescriptor(member) and not \
isinstance(member, cls.method_types) and not \
type(member).__name__ == "method_descriptor"
- return isdatadesc or \
- (isattr and not isinstance(parent, ModuleDocumenter))
+ return isdatadesc or (not isinstance(parent, ModuleDocumenter)
+ and not inspect.isroutine(member)
+ and not isinstance(member, class_types))
def document_members(self, all_members=False):
pass
+ def import_object(self):
+ ret = ClassLevelDocumenter.import_object(self)
+ if isdescriptor(self.object) and \
+ not isinstance(self.object, self.method_types):
+ self._datadescriptor = True
+ else:
+ # if it's not a data descriptor
+ self._datadescriptor = False
+ return ret
+
def get_real_modname(self):
return self.get_attr(self.parent or self.object, '__module__', None) \
or self.modname
+ def add_directive_header(self, sig):
+ ClassLevelDocumenter.add_directive_header(self, sig)
+ if not self._datadescriptor:
+ try:
+ objrepr = safe_repr(self.object)
+ except ValueError:
+ pass
+ else:
+ self.add_line(u' :annotation: = ' + objrepr, '<autodoc>')
+
+ def add_content(self, more_content, no_docstring=False):
+ if not self._datadescriptor:
+ # if it's not a data descriptor, its docstring is very probably the
+ # wrong thing to display
+ no_docstring = True
+ ClassLevelDocumenter.add_content(self, more_content, no_docstring)
+
class InstanceAttributeDocumenter(AttributeDocumenter):
"""
@@ -1106,6 +1226,7 @@ class InstanceAttributeDocumenter(AttributeDocumenter):
"""Never import anything."""
# disguise as an attribute
self.objtype = 'attribute'
+ self._datadescriptor = False
return True
def add_content(self, more_content, no_docstring=False):
@@ -1135,8 +1256,10 @@ class AutoDirective(Directive):
_special_attrgetters = {}
# flags that can be given in autodoc_default_flags
- _default_flags = set(['members', 'undoc-members', 'inherited-members',
- 'show-inheritance'])
+ _default_flags = set([
+ 'members', 'undoc-members', 'inherited-members', 'show-inheritance',
+ 'private-members', 'special-members',
+ ])
# standard docutils directive settings
has_content = True
@@ -1226,6 +1349,17 @@ def setup(app):
app.add_config_value('autoclass_content', 'class', True)
app.add_config_value('autodoc_member_order', 'alphabetic', True)
app.add_config_value('autodoc_default_flags', [], True)
+ app.add_config_value('autodoc_docstring_signature', True, True)
app.add_event('autodoc-process-docstring')
app.add_event('autodoc-process-signature')
app.add_event('autodoc-skip-member')
+
+
+class testcls:
+ """test doc string"""
+
+ def __getattr__(self, x):
+ return x
+
+ def __setattr__(self, x, y):
+ """Attr setter."""
diff --git a/sphinx/ext/autosummary/__init__.py b/sphinx/ext/autosummary/__init__.py
index a194fba8..0f5c2640 100644
--- a/sphinx/ext/autosummary/__init__.py
+++ b/sphinx/ext/autosummary/__init__.py
@@ -73,8 +73,7 @@ class autosummary_toc(nodes.comment):
pass
def process_autosummary_toc(app, doctree):
- """
- Insert items described in autosummary:: to the TOC tree, but do
+ """Insert items described in autosummary:: to the TOC tree, but do
not generate the toctree:: list.
"""
env = app.builder.env
@@ -126,22 +125,39 @@ def autosummary_table_visit_html(self, node):
# -- autodoc integration -------------------------------------------------------
-try:
- ismemberdescriptor = inspect.ismemberdescriptor
- isgetsetdescriptor = inspect.isgetsetdescriptor
-except AttributeError:
- def ismemberdescriptor(obj):
- return False
- isgetsetdescriptor = ismemberdescriptor
+class FakeDirective:
+ env = {}
+ genopt = {}
def get_documenter(obj, parent):
+ """Get an autodoc.Documenter class suitable for documenting the given
+ object.
+
+ *obj* is the Python object to be documented, and *parent* is an
+ another Python object (e.g. a module or a class) to which *obj*
+ belongs to.
"""
- Get an autodoc.Documenter class suitable for documenting the given object
- """
- from sphinx.ext.autodoc import AutoDirective, DataDocumenter
+ from sphinx.ext.autodoc import AutoDirective, DataDocumenter, \
+ ModuleDocumenter
+
+ if inspect.ismodule(obj):
+ # ModuleDocumenter.can_document_member always returns False
+ return ModuleDocumenter
+ # Construct a fake documenter for *parent*
+ if parent is not None:
+ parent_doc_cls = get_documenter(parent, None)
+ else:
+ parent_doc_cls = ModuleDocumenter
+
+ if hasattr(parent, '__name__'):
+ parent_doc = parent_doc_cls(FakeDirective(), parent.__name__)
+ else:
+ parent_doc = parent_doc_cls(FakeDirective(), "")
+
+ # Get the corrent documenter class for *obj*
classes = [cls for cls in AutoDirective._registry.values()
- if cls.can_document_member(obj, '', False, parent)]
+ if cls.can_document_member(obj, '', False, parent_doc)]
if classes:
classes.sort(key=lambda cls: cls.priority)
return classes[-1]
@@ -155,7 +171,7 @@ class Autosummary(Directive):
"""
Pretty table containing short signatures and summaries of functions etc.
- autosummary also generates a (hidden) toctree:: node.
+ autosummary can also optionally generate a hidden toctree:: node.
"""
required_arguments = 0
@@ -210,16 +226,12 @@ class Autosummary(Directive):
return self.warnings + nodes
def get_items(self, names):
- """
- Try to import the given names, and return a list of
+ """Try to import the given names, and return a list of
``[(name, signature, summary_string, real_name), ...]``.
"""
env = self.state.document.settings.env
- prefixes = ['']
- currmodule = env.temp_data.get('py:module')
- if currmodule:
- prefixes.insert(0, currmodule)
+ prefixes = get_import_prefixes_from_env(env)
items = []
@@ -279,8 +291,7 @@ class Autosummary(Directive):
return items
def get_table(self, items):
- """
- Generate a proper list of table nodes for autosummary:: directive.
+ """Generate a proper list of table nodes for autosummary:: directive.
*items* is a list produced by :meth:`get_items`.
"""
@@ -325,13 +336,29 @@ class Autosummary(Directive):
def mangle_signature(sig, max_chars=30):
"""Reformat a function signature to a more compact form."""
- sig = re.sub(r"^\((.*)\)$", r"\1", sig) + ", "
- r = re.compile(r"(?P<name>[a-zA-Z0-9_*]+)(?P<default>=.*?)?, ")
- items = r.findall(sig)
+ s = re.sub(r"^\((.*)\)$", r"\1", sig).strip()
+
+ # Strip strings (which can contain things that confuse the code below)
+ s = re.sub(r"\\\\", "", s)
+ s = re.sub(r"\\'", "", s)
+ s = re.sub(r"'[^']*'", "", s)
+
+ # Parse the signature to arguments + options
+ args = []
+ opts = []
+
+ opt_re = re.compile(r"^(.*, |)([a-zA-Z0-9_*]+)=")
+ while s:
+ m = opt_re.search(s)
+ if not m:
+ # The rest are arguments
+ args = s.split(', ')
+ break
- args = [name for name, default in items if not default]
- opts = [name for name, default in items if default]
+ opts.insert(0, m.group(2))
+ s = m.group(1)[:-2]
+ # Produce a more compact signature
sig = limited_join(", ", args, max_chars=max_chars-2)
if opts:
if not sig:
@@ -343,8 +370,7 @@ def mangle_signature(sig, max_chars=30):
return u"(%s)" % sig
def limited_join(sep, items, max_chars=30, overflow_marker="..."):
- """
- Join a number of strings to one, limiting the length to *max_chars*.
+ """Join a number of strings to one, limiting the length to *max_chars*.
If the string overflows this limit, replace the last fitting item by
*overflow_marker*.
@@ -368,9 +394,28 @@ def limited_join(sep, items, max_chars=30, overflow_marker="..."):
# -- Importing items -----------------------------------------------------------
-def import_by_name(name, prefixes=[None]):
+def get_import_prefixes_from_env(env):
+ """
+ Obtain current Python import prefixes (for `import_by_name`)
+ from ``document.env``
"""
- Import a Python object that has the given *name*, under one of the
+ prefixes = [None]
+
+ currmodule = env.temp_data.get('py:module')
+ if currmodule:
+ prefixes.insert(0, currmodule)
+
+ currclass = env.temp_data.get('py:class')
+ if currclass:
+ if currmodule:
+ prefixes.insert(0, currmodule + "." + currclass)
+ else:
+ prefixes.insert(0, currclass)
+
+ return prefixes
+
+def import_by_name(name, prefixes=[None]):
+ """Import a Python object that has the given *name*, under one of the
*prefixes*. The first name that succeeds is used.
"""
tried = []
@@ -431,8 +476,7 @@ def _import_by_name(name):
def autolink_role(typ, rawtext, etext, lineno, inliner,
options={}, content=[]):
- """
- Smart linking role.
+ """Smart linking role.
Expands to ':obj:`text`' if `text` is an object that can be imported;
otherwise expands to '*text*'.
@@ -442,8 +486,7 @@ def autolink_role(typ, rawtext, etext, lineno, inliner,
'obj', rawtext, etext, lineno, inliner, options, content)
pnode = r[0][0]
- prefixes = [None]
- #prefixes.insert(0, inliner.document.settings.env.currmodule)
+ prefixes = get_import_prefixes_from_env(env)
try:
name, obj, parent = import_by_name(pnode['reftarget'], prefixes)
except ImportError:
@@ -483,12 +526,14 @@ def setup(app):
html=(autosummary_toc_visit_html, autosummary_noop),
latex=(autosummary_noop, autosummary_noop),
text=(autosummary_noop, autosummary_noop),
- man=(autosummary_noop, autosummary_noop))
+ man=(autosummary_noop, autosummary_noop),
+ texinfo=(autosummary_noop, autosummary_noop))
app.add_node(autosummary_table,
html=(autosummary_table_visit_html, autosummary_noop),
latex=(autosummary_noop, autosummary_noop),
text=(autosummary_noop, autosummary_noop),
- man=(autosummary_noop, autosummary_noop))
+ man=(autosummary_noop, autosummary_noop),
+ texinfo=(autosummary_noop, autosummary_noop))
app.add_directive('autosummary', Autosummary)
app.add_role('autolink', autolink_role)
app.connect('doctree-read', process_autosummary_toc)
diff --git a/sphinx/ext/autosummary/generate.py b/sphinx/ext/autosummary/generate.py
index dc1d6a43..c1eb2ac5 100644
--- a/sphinx/ext/autosummary/generate.py
+++ b/sphinx/ext/autosummary/generate.py
@@ -12,11 +12,12 @@
Example Makefile rule::
generate:
- sphinx-autogen source/*.rst source/generated
+ sphinx-autogen -o source/generated source/*.rst
:copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
:license: BSD, see LICENSE for details.
"""
+
import os
import re
import sys
@@ -199,8 +200,8 @@ def generate_autosummary_docs(sources, output_dir=None, suffix='.rst',
# -- Finding documented entries in files ---------------------------------------
def find_autosummary_in_files(filenames):
- """
- Find out what items are documented in source/*.rst.
+ """Find out what items are documented in source/*.rst.
+
See `find_autosummary_in_lines`.
"""
documented = []
@@ -212,8 +213,8 @@ def find_autosummary_in_files(filenames):
return documented
def find_autosummary_in_docstring(name, module=None, filename=None):
- """
- Find out what items are documented in the given object's docstring.
+ """Find out what items are documented in the given object's docstring.
+
See `find_autosummary_in_lines`.
"""
try:
@@ -227,8 +228,8 @@ def find_autosummary_in_docstring(name, module=None, filename=None):
return []
def find_autosummary_in_lines(lines, module=None, filename=None):
- """
- Find out what items appear in autosummary:: directives in the given lines.
+ """Find out what items appear in autosummary:: directives in the
+ given lines.
Returns a list of (name, toctree, template) where *name* is a name
of an object and *toctree* the :toctree: path of the corresponding
@@ -237,7 +238,7 @@ def find_autosummary_in_lines(lines, module=None, filename=None):
*template* ``None`` if the directive does not have the
corresponding options set.
"""
- autosummary_re = re.compile(r'^\s*\.\.\s+autosummary::\s*')
+ autosummary_re = re.compile(r'^(\s*)\.\.\s+autosummary::\s*')
automodule_re = re.compile(
r'^\s*\.\.\s+automodule::\s*([A-Za-z0-9_.]+)\s*$')
module_re = re.compile(
@@ -252,6 +253,7 @@ def find_autosummary_in_lines(lines, module=None, filename=None):
template = None
current_module = module
in_autosummary = False
+ base_indent = ""
for line in lines:
if in_autosummary:
@@ -282,7 +284,7 @@ def find_autosummary_in_lines(lines, module=None, filename=None):
documented.append((name, toctree, template))
continue
- if not line.strip():
+ if not line.strip() or line.startswith(base_indent + " "):
continue
in_autosummary = False
@@ -290,6 +292,7 @@ def find_autosummary_in_lines(lines, module=None, filename=None):
m = autosummary_re.match(line)
if m:
in_autosummary = True
+ base_indent = m.group(1)
toctree = None
template = None
continue
diff --git a/sphinx/ext/coverage.py b/sphinx/ext/coverage.py
index 2620df23..5abbee09 100644
--- a/sphinx/ext/coverage.py
+++ b/sphinx/ext/coverage.py
@@ -105,7 +105,8 @@ class CoverageBuilder(Builder):
output_file = path.join(self.outdir, 'c.txt')
op = open(output_file, 'w')
try:
- write_header(op, 'Undocumented C API elements', '=')
+ if self.config.coverage_write_headline:
+ write_header(op, 'Undocumented C API elements', '=')
op.write('\n')
for filename, undoc in self.c_undoc.iteritems():
@@ -120,6 +121,8 @@ class CoverageBuilder(Builder):
objects = self.env.domaindata['py']['objects']
modules = self.env.domaindata['py']['modules']
+ skip_undoc = self.config.coverage_skip_undoc_in_source
+
for mod_name in modules:
ignore = False
for exp in self.mod_ignorexps:
@@ -160,6 +163,8 @@ class CoverageBuilder(Builder):
if exp.match(name):
break
else:
+ if skip_undoc and not obj.__doc__:
+ continue
funcs.append(name)
elif inspect.isclass(obj):
for exp in self.cls_ignorexps:
@@ -167,17 +172,27 @@ class CoverageBuilder(Builder):
break
else:
if full_name not in objects:
+ if skip_undoc and not obj.__doc__:
+ continue
# not documented at all
classes[name] = []
continue
attrs = []
- for attr_name, attr in inspect.getmembers(
- obj, inspect.ismethod):
+ for attr_name in dir(obj):
+ if attr_name not in obj.__dict__:
+ continue
+ attr = getattr(obj, attr_name)
+ if not (inspect.ismethod(attr) or
+ inspect.isfunction(attr)):
+ continue
if attr_name[0] == '_':
# starts with an underscore, ignore it
continue
+ if skip_undoc and not attr.__doc__:
+ # skip methods without docstring if wished
+ continue
full_attr_name = '%s.%s' % (full_name, attr_name)
if full_attr_name not in objects:
@@ -194,8 +209,8 @@ class CoverageBuilder(Builder):
op = open(output_file, 'w')
failed = []
try:
- write_header(op, 'Undocumented Python objects', '=')
-
+ if self.config.coverage_write_headline:
+ write_header(op, 'Undocumented Python objects', '=')
keys = self.py_undoc.keys()
keys.sort()
for name in keys:
@@ -218,7 +233,7 @@ class CoverageBuilder(Builder):
if not methods:
op.write(' * %s\n' % name)
else:
- op.write(' * %s -- missing methods:\n' % name)
+ op.write(' * %s -- missing methods:\n\n' % name)
op.writelines(' - %s\n' % x for x in methods)
op.write('\n')
@@ -246,3 +261,5 @@ def setup(app):
app.add_config_value('coverage_c_path', [], False)
app.add_config_value('coverage_c_regexes', {}, False)
app.add_config_value('coverage_ignore_c_items', {}, False)
+ app.add_config_value('coverage_write_headline', True, False)
+ app.add_config_value('coverage_skip_undoc_in_source', False, False)
diff --git a/sphinx/ext/doctest.py b/sphinx/ext/doctest.py
index a981b9bc..fdf4f2f4 100644
--- a/sphinx/ext/doctest.py
+++ b/sphinx/ext/doctest.py
@@ -57,7 +57,7 @@ class TestDirective(Directive):
test = code
code = doctestopt_re.sub('', code)
nodetype = nodes.literal_block
- if self.name == 'testsetup' or 'hide' in self.options:
+ if self.name in ('testsetup', 'testcleanup') or 'hide' in self.options:
nodetype = nodes.comment
if self.arguments:
groups = [x.strip() for x in self.arguments[0].split(',')]
@@ -87,6 +87,9 @@ class TestDirective(Directive):
class TestsetupDirective(TestDirective):
option_spec = {}
+class TestcleanupDirective(TestDirective):
+ option_spec = {}
+
class DoctestDirective(TestDirective):
option_spec = {
'hide': directives.flag,
@@ -114,6 +117,7 @@ class TestGroup(object):
self.name = name
self.setup = []
self.tests = []
+ self.cleanup = []
def add_code(self, code, prepend=False):
if code.type == 'testsetup':
@@ -121,6 +125,8 @@ class TestGroup(object):
self.setup.insert(0, code)
else:
self.setup.append(code)
+ elif code.type == 'testcleanup':
+ self.cleanup.append(code)
elif code.type == 'doctest':
self.tests.append([code])
elif code.type == 'testcode':
@@ -132,8 +138,8 @@ class TestGroup(object):
raise RuntimeError('invalid TestCode type')
def __repr__(self):
- return 'TestGroup(name=%r, setup=%r, tests=%r)' % (
- self.name, self.setup, self.tests)
+ return 'TestGroup(name=%r, setup=%r, cleanup=%r, tests=%r)' % (
+ self.name, self.setup, self.cleanup, self.tests)
class TestCode(object):
@@ -150,14 +156,14 @@ class TestCode(object):
class SphinxDocTestRunner(doctest.DocTestRunner):
def summarize(self, out, verbose=None):
- io = StringIO.StringIO()
+ string_io = StringIO.StringIO()
old_stdout = sys.stdout
- sys.stdout = io
+ sys.stdout = string_io
try:
res = doctest.DocTestRunner.summarize(self, verbose)
finally:
sys.stdout = old_stdout
- out(io.getvalue())
+ out(string_io.getvalue())
return res
def _DocTestRunner__patched_linecache_getlines(self, filename,
@@ -205,6 +211,8 @@ class DocTestBuilder(Builder):
self.total_tries = 0
self.setup_failures = 0
self.setup_tries = 0
+ self.cleanup_failures = 0
+ self.cleanup_tries = 0
date = time.strftime('%Y-%m-%d %H:%M:%S')
@@ -241,12 +249,14 @@ Doctest summary
%5d test%s
%5d failure%s in tests
%5d failure%s in setup code
+%5d failure%s in cleanup code
''' % (self.total_tries, s(self.total_tries),
self.total_failures, s(self.total_failures),
- self.setup_failures, s(self.setup_failures)))
+ self.setup_failures, s(self.setup_failures),
+ self.cleanup_failures, s(self.cleanup_failures)))
self.outfile.close()
- if self.total_failures or self.setup_failures:
+ if self.total_failures or self.setup_failures or self.cleanup_failures:
self.app.statuscode = 1
def write(self, build_docnames, updated_docnames, method='update'):
@@ -266,6 +276,12 @@ Doctest summary
optionflags=self.opt)
self.test_runner = SphinxDocTestRunner(verbose=False,
optionflags=self.opt)
+ self.cleanup_runner = SphinxDocTestRunner(verbose=False,
+ optionflags=self.opt)
+
+ self.test_runner._fakeout = self.setup_runner._fakeout
+ self.cleanup_runner._fakeout = self.setup_runner._fakeout
+
if self.config.doctest_test_doctest_blocks:
def condition(node):
return (isinstance(node, (nodes.literal_block, nodes.comment))
@@ -299,6 +315,11 @@ Doctest summary
'testsetup', lineno=0)
for group in groups.itervalues():
group.add_code(code, prepend=True)
+ if self.config.doctest_global_cleanup:
+ code = TestCode(self.config.doctest_global_cleanup,
+ 'testcleanup', lineno=0)
+ for group in groups.itervalues():
+ group.add_code(code)
if not groups:
return
@@ -314,29 +335,43 @@ Doctest summary
res_f, res_t = self.test_runner.summarize(self._out, verbose=True)
self.total_failures += res_f
self.total_tries += res_t
+ if self.cleanup_runner.tries:
+ res_f, res_t = self.cleanup_runner.summarize(self._out,
+ verbose=True)
+ self.cleanup_failures += res_f
+ self.cleanup_tries += res_t
def compile(self, code, name, type, flags, dont_inherit):
return compile(code, name, self.type, flags, dont_inherit)
def test_group(self, group, filename):
ns = {}
- setup_examples = []
- for setup in group.setup:
- setup_examples.append(doctest.Example(setup.code, '',
- lineno=setup.lineno))
- if setup_examples:
- # simulate a doctest with the setup code
- setup_doctest = doctest.DocTest(setup_examples, {},
- '%s (setup code)' % group.name,
- filename, 0, None)
- setup_doctest.globs = ns
- old_f = self.setup_runner.failures
+
+ def run_setup_cleanup(runner, testcodes, what):
+ examples = []
+ for testcode in testcodes:
+ examples.append(doctest.Example(testcode.code, '',
+ lineno=testcode.lineno))
+ if not examples:
+ return True
+ # simulate a doctest with the code
+ sim_doctest = doctest.DocTest(examples, {},
+ '%s (%s code)' % (group.name, what),
+ filename, 0, None)
+ sim_doctest.globs = ns
+ old_f = runner.failures
self.type = 'exec' # the snippet may contain multiple statements
- self.setup_runner.run(setup_doctest, out=self._warn_out,
- clear_globs=False)
- if self.setup_runner.failures > old_f:
- # don't run the group
- return
+ runner.run(sim_doctest, out=self._warn_out, clear_globs=False)
+ if runner.failures > old_f:
+ return False
+ return True
+
+ # run the setup code
+ if not run_setup_cleanup(self.setup_runner, group.setup, 'setup'):
+ # if setup failed, don't run the group
+ return
+
+ # run the tests
for code in group.tests:
if len(code) == 1:
# ordinary doctests (code/output interleaved)
@@ -374,9 +409,13 @@ Doctest summary
# also don't clear the globs namespace after running the doctest
self.test_runner.run(test, out=self._warn_out, clear_globs=False)
+ # run the cleanup
+ run_setup_cleanup(self.cleanup_runner, group.cleanup, 'cleanup')
+
def setup(app):
app.add_directive('testsetup', TestsetupDirective)
+ app.add_directive('testcleanup', TestcleanupDirective)
app.add_directive('doctest', DoctestDirective)
app.add_directive('testcode', TestcodeDirective)
app.add_directive('testoutput', TestoutputDirective)
@@ -385,3 +424,4 @@ def setup(app):
app.add_config_value('doctest_path', [], False)
app.add_config_value('doctest_test_doctest_blocks', 'default', False)
app.add_config_value('doctest_global_setup', '', False)
+ app.add_config_value('doctest_global_cleanup', '', False)
diff --git a/sphinx/ext/graphviz.py b/sphinx/ext/graphviz.py
index bf62c063..ee935945 100644
--- a/sphinx/ext/graphviz.py
+++ b/sphinx/ext/graphviz.py
@@ -11,6 +11,7 @@
"""
import re
+import codecs
import posixpath
from os import path
from math import ceil
@@ -25,12 +26,11 @@ from docutils.parsers.rst import directives
from sphinx.errors import SphinxError
from sphinx.locale import _
-from sphinx.util.osutil import ensuredir, ENOENT, EPIPE
+from sphinx.util.osutil import ensuredir, ENOENT, EPIPE, EINVAL
from sphinx.util.compat import Directive
mapname_re = re.compile(r'<map id="(.*?)"')
-svg_dim_re = re.compile(r'<svg\swidth="(\d+)pt"\sheight="(\d+)pt"', re.M)
class GraphvizError(SphinxError):
@@ -47,23 +47,48 @@ class Graphviz(Directive):
"""
has_content = True
required_arguments = 0
- optional_arguments = 0
+ optional_arguments = 1
final_argument_whitespace = False
option_spec = {
'alt': directives.unchanged,
+ 'inline': directives.flag,
+ 'caption': directives.unchanged,
}
def run(self):
- dotcode = '\n'.join(self.content)
- if not dotcode.strip():
- return [self.state_machine.reporter.warning(
- 'Ignoring "graphviz" directive without content.',
- line=self.lineno)]
+ if self.arguments:
+ document = self.state.document
+ if self.content:
+ return [document.reporter.warning(
+ 'Graphviz directive cannot have both content and '
+ 'a filename argument', line=self.lineno)]
+ env = self.state.document.settings.env
+ rel_filename, filename = env.relfn2path(self.arguments[0])
+ env.note_dependency(rel_filename)
+ try:
+ fp = codecs.open(filename, 'r', 'utf-8')
+ try:
+ dotcode = fp.read()
+ finally:
+ fp.close()
+ except (IOError, OSError):
+ return [document.reporter.warning(
+ 'External Graphviz file %r not found or reading '
+ 'it failed' % filename, line=self.lineno)]
+ else:
+ dotcode = '\n'.join(self.content)
+ if not dotcode.strip():
+ return [self.state_machine.reporter.warning(
+ 'Ignoring "graphviz" directive without content.',
+ line=self.lineno)]
node = graphviz()
node['code'] = dotcode
node['options'] = []
if 'alt' in self.options:
node['alt'] = self.options['alt']
+ if 'caption' in self.options:
+ node['caption'] = self.options['caption']
+ node['inline'] = 'inline' in self.options
return [node]
@@ -77,6 +102,8 @@ class GraphvizSimple(Directive):
final_argument_whitespace = False
option_spec = {
'alt': directives.unchanged,
+ 'inline': directives.flag,
+ 'caption': directives.unchanged,
}
def run(self):
@@ -86,14 +113,16 @@ class GraphvizSimple(Directive):
node['options'] = []
if 'alt' in self.options:
node['alt'] = self.options['alt']
+ if 'caption' in self.options:
+ node['caption'] = self.options['caption']
+ node['inline'] = 'inline' in self.options
return [node]
def render_dot(self, code, options, format, prefix='graphviz'):
- """
- Render graphviz code into a PNG or PDF output file.
- """
+ """Render graphviz code into a PNG or PDF output file."""
hashkey = code.encode('utf-8') + str(options) + \
+ str(self.builder.config.graphviz_dot) + \
str(self.builder.config.graphviz_dot_args)
fname = '%s-%s.%s' % (prefix, sha(hashkey).hexdigest(), format)
if hasattr(self.builder, 'imgpath'):
@@ -134,6 +163,7 @@ def render_dot(self, code, options, format, prefix='graphviz'):
self.builder.config.graphviz_dot)
self.builder._graphviz_warned_dot = True
return None, None
+ wentWrong = False
try:
# Graphviz may close standard input when an error occurs,
# resulting in a broken pipe on communicate()
@@ -141,6 +171,12 @@ def render_dot(self, code, options, format, prefix='graphviz'):
except (OSError, IOError), err:
if err.errno != EPIPE:
raise
+ wentWrong = True
+ except IOError, err:
+ if err.errno != EINVAL:
+ raise
+ wentWrong = True
+ if wentWrong:
# in this case, read the standard output and standard error streams
# directly, to get the error message(s)
stdout, stderr = p.stdout.read(), p.stderr.read()
@@ -151,37 +187,6 @@ def render_dot(self, code, options, format, prefix='graphviz'):
return relfn, outfn
-def get_svg_tag(svgref, svgfile, imgcls=None):
- # Webkit can't figure out svg dimensions when using object tag
- # so we need to get it from the svg file
- fp = open(svgfile, 'r')
- try:
- for line in fp:
- match = svg_dim_re.match(line)
- if match:
- dimensions = match.groups()
- break
- else:
- dimensions = None
- finally:
- fp.close()
-
- # We need this hack to make WebKit show our object tag properly
- def pt2px(x):
- return int(ceil((96.0/72.0) * float(x)))
-
- if dimensions:
- style = ' width="%s" height="%s"' % tuple(map(pt2px, dimensions))
- else:
- style = ''
-
- # The object tag works fine on Firefox and WebKit
- # Besides it's a hack, this strategy does not mess with templates.
- imgcss = imgcls and ' class="%s"' % imgcls or ''
- return '<object type="image/svg+xml" data="%s"%s%s></object>\n' % \
- (svgref, imgcss, style)
-
-
def render_dot_html(self, node, code, options, prefix='graphviz',
imgcls=None, alt=None):
format = self.builder.config.graphviz_output_format
@@ -194,14 +199,21 @@ def render_dot_html(self, node, code, options, prefix='graphviz',
self.builder.warn('dot code %r: ' % code + str(exc))
raise nodes.SkipNode
- self.body.append(self.starttag(node, 'p', CLASS='graphviz'))
+ inline = node.get('inline', False)
+ if inline:
+ wrapper = 'span'
+ else:
+ wrapper = 'p'
+
+ self.body.append(self.starttag(node, wrapper, CLASS='graphviz'))
if fname is None:
self.body.append(self.encode(code))
else:
if alt is None:
alt = node.get('alt', self.encode(code).strip())
+ imgcss = imgcls and 'class="%s"' % imgcls or ''
if format == 'svg':
- svgtag = get_svg_tag(fname, outfn, imgcls)
+ svgtag = '<img src="%s" alt="%s" %s/>\n' % (fname, alt, imgcss)
self.body.append(svgtag)
else:
mapfile = open(outfn + '.map', 'rb')
@@ -209,7 +221,6 @@ def render_dot_html(self, node, code, options, prefix='graphviz',
imgmap = mapfile.readlines()
finally:
mapfile.close()
- imgcss = imgcls and 'class="%s"' % imgcls or ''
if len(imgmap) == 2:
# nothing in image map (the lines are <map> and </map>)
self.body.append('<img src="%s" alt="%s" %s/>\n' %
@@ -220,8 +231,11 @@ def render_dot_html(self, node, code, options, prefix='graphviz',
self.body.append('<img src="%s" alt="%s" usemap="#%s" %s/>\n' %
(fname, alt, mapname, imgcss))
self.body.extend(imgmap)
+ if node.get('caption') and not inline:
+ self.body.append('</p>\n<p class="caption">')
+ self.body.append(self.encode(node['caption']))
- self.body.append('</p>\n')
+ self.body.append('</%s>\n' % wrapper)
raise nodes.SkipNode
@@ -236,8 +250,25 @@ def render_dot_latex(self, node, code, options, prefix='graphviz'):
self.builder.warn('dot code %r: ' % code + str(exc))
raise nodes.SkipNode
+ inline = node.get('inline', False)
+ if inline:
+ para_separator = ''
+ else:
+ para_separator = '\n'
+
if fname is not None:
- self.body.append('\n\\includegraphics{%s}\n' % fname)
+ caption = node.get('caption')
+ # XXX add ids from previous target node
+ if caption and not inline:
+ self.body.append('\n\\begin{figure}[h!]')
+ self.body.append('\n\\begin{center}')
+ self.body.append('\n\\caption{%s}' % self.encode(caption))
+ self.body.append('\n\\includegraphics{%s}' % fname)
+ self.body.append('\n\\end{center}')
+ self.body.append('\n\\end{figure}\n')
+ else:
+ self.body.append('%s\\includegraphics{%s}%s' %
+ (para_separator, fname, para_separator))
raise nodes.SkipNode
@@ -245,11 +276,29 @@ def latex_visit_graphviz(self, node):
render_dot_latex(self, node, node['code'], node['options'])
+def render_dot_texinfo(self, node, code, options, prefix='graphviz'):
+ try:
+ fname, outfn = render_dot(self, code, options, 'png', prefix)
+ except GraphvizError, exc:
+ self.builder.warn('dot code %r: ' % code + str(exc))
+ raise nodes.SkipNode
+ if fname is not None:
+ self.body.append('\n\n@float\n')
+ caption = node.get('caption')
+ if caption:
+ self.body.append('@caption{%s}\n' % self.escape_arg(caption))
+ self.body.append('@image{%s,,,[graphviz],png}\n'
+ '@end float\n\n' % fname[:-4])
+ raise nodes.SkipNode
+
+def texinfo_visit_graphviz(self, node):
+ render_dot_texinfo(self, node, node['code'], node['options'])
+
+
def text_visit_graphviz(self, node):
if 'alt' in node.attributes:
self.add_text(_('[graph: %s]') % node['alt'])
self.add_text(_('[graph]'))
- raise nodes.SkipNode
def man_visit_graphviz(self, node):
@@ -263,6 +312,7 @@ def setup(app):
app.add_node(graphviz,
html=(html_visit_graphviz, None),
latex=(latex_visit_graphviz, None),
+ texinfo=(texinfo_visit_graphviz, None),
text=(text_visit_graphviz, None),
man=(man_visit_graphviz, None))
app.add_directive('graphviz', Graphviz)
diff --git a/sphinx/ext/inheritance_diagram.py b/sphinx/ext/inheritance_diagram.py
index 1b49720f..a2490486 100644
--- a/sphinx/ext/inheritance_diagram.py
+++ b/sphinx/ext/inheritance_diagram.py
@@ -47,7 +47,8 @@ except ImportError:
from docutils import nodes
from docutils.parsers.rst import directives
-from sphinx.ext.graphviz import render_dot_html, render_dot_latex
+from sphinx.ext.graphviz import render_dot_html, render_dot_latex, \
+ render_dot_texinfo
from sphinx.util.compat import Directive
@@ -66,24 +67,23 @@ class InheritanceGraph(object):
from all the way to the root "object", and then is able to generate a
graphviz dot graph from them.
"""
- def __init__(self, class_names, currmodule, show_builtins=False, parts=0):
- """
- *class_names* is a list of child classes to show bases from.
+ def __init__(self, class_names, currmodule, show_builtins=False,
+ private_bases=False, parts=0):
+ """*class_names* is a list of child classes to show bases from.
If *show_builtins* is True, then Python builtins will be shown
in the graph.
"""
self.class_names = class_names
classes = self._import_classes(class_names, currmodule)
- self.class_info = self._class_info(classes, show_builtins, parts)
+ self.class_info = self._class_info(classes, show_builtins,
+ private_bases, parts)
if not self.class_info:
raise InheritanceException('No classes found for '
'inheritance diagram')
def _import_class_or_module(self, name, currmodule):
- """
- Import a class using its fully-qualified *name*.
- """
+ """Import a class using its fully-qualified *name*."""
try:
path, base = class_sig_re.match(name).groups()
except (AttributeError, ValueError):
@@ -134,7 +134,7 @@ class InheritanceGraph(object):
classes.extend(self._import_class_or_module(name, currmodule))
return classes
- def _class_info(self, classes, show_builtins, parts):
+ def _class_info(self, classes, show_builtins, private_bases, parts):
"""Return name and bases for all classes that are ancestors of
*classes*.
@@ -147,6 +147,8 @@ class InheritanceGraph(object):
def recurse(cls):
if not show_builtins and cls in builtins:
return
+ if not private_bases and cls.__name__.startswith('_'):
+ return
nodename = self.class_name(cls, parts)
fullname = self.class_name(cls, 0)
@@ -156,6 +158,8 @@ class InheritanceGraph(object):
for base in cls.__bases__:
if not show_builtins and base in builtins:
continue
+ if not private_bases and base.__name__.startswith('_'):
+ continue
baselist.append(self.class_name(base, parts))
if base not in all_classes:
recurse(base)
@@ -182,9 +186,7 @@ class InheritanceGraph(object):
return '.'.join(name_parts[-parts:])
def get_all_class_names(self):
- """
- Get all of the class names involved in the graph.
- """
+ """Get all of the class names involved in the graph."""
return [fullname for (_, fullname, _) in self.class_info]
# These are the default attrs for graphviz
@@ -213,9 +215,8 @@ class InheritanceGraph(object):
def generate_dot(self, name, urls={}, env=None,
graph_attrs={}, node_attrs={}, edge_attrs={}):
- """
- Generate a graphviz dot graph from the classes that
- were passed in to __init__.
+ """Generate a graphviz dot graph from the classes that were passed in
+ to __init__.
*name* is the name of the graph.
@@ -274,6 +275,7 @@ class InheritanceDiagram(Directive):
final_argument_whitespace = True
option_spec = {
'parts': directives.nonnegative_int,
+ 'private-bases': directives.flag,
}
def run(self):
@@ -290,7 +292,8 @@ class InheritanceDiagram(Directive):
try:
graph = InheritanceGraph(
class_names, env.temp_data.get('py:module'),
- parts=node['parts'])
+ parts=node['parts'],
+ private_bases='private-bases' in self.options)
except InheritanceException, err:
return [node.document.reporter.warning(err.args[0],
line=self.lineno)]
@@ -352,6 +355,21 @@ def latex_visit_inheritance_diagram(self, node):
raise nodes.SkipNode
+def texinfo_visit_inheritance_diagram(self, node):
+ """
+ Output the graph for Texinfo. This will insert a PNG.
+ """
+ graph = node['graph']
+
+ graph_hash = get_graph_hash(node)
+ name = 'inheritance%s' % graph_hash
+
+ dotcode = graph.generate_dot(name, env=self.builder.env,
+ graph_attrs={'size': '"6.0,6.0"'})
+ render_dot_texinfo(self, node, dotcode, [], 'inheritance')
+ raise nodes.SkipNode
+
+
def skip(self, node):
raise nodes.SkipNode
@@ -363,7 +381,8 @@ def setup(app):
latex=(latex_visit_inheritance_diagram, None),
html=(html_visit_inheritance_diagram, None),
text=(skip, None),
- man=(skip, None))
+ man=(skip, None),
+ texinfo=(texinfo_visit_inheritance_diagram, None))
app.add_directive('inheritance-diagram', InheritanceDiagram)
app.add_config_value('inheritance_graph_attrs', {}, False),
app.add_config_value('inheritance_node_attrs', {}, False),
diff --git a/sphinx/ext/intersphinx.py b/sphinx/ext/intersphinx.py
index 17fe1899..ac229a66 100644
--- a/sphinx/ext/intersphinx.py
+++ b/sphinx/ext/intersphinx.py
@@ -26,6 +26,7 @@
import time
import zlib
+import codecs
import urllib2
import posixpath
from os import path
@@ -34,19 +35,26 @@ from docutils import nodes
from sphinx.locale import _
from sphinx.builders.html import INVENTORY_FILENAME
+from sphinx.util.pycompat import b
+
handlers = [urllib2.ProxyHandler(), urllib2.HTTPRedirectHandler(),
urllib2.HTTPHandler()]
-if hasattr(urllib2, 'HTTPSHandler'):
+try:
handlers.append(urllib2.HTTPSHandler)
+except NameError:
+ pass
urllib2.install_opener(urllib2.build_opener(*handlers))
+UTF8StreamReader = codecs.lookup('utf-8')[2]
+
def read_inventory_v1(f, uri, join):
+ f = UTF8StreamReader(f)
invdata = {}
line = f.next()
- projname = line.rstrip()[11:].decode('utf-8')
+ projname = line.rstrip()[11:]
line = f.next()
version = line.rstrip()[11:]
for line in f:
@@ -69,25 +77,25 @@ def read_inventory_v2(f, uri, join, bufsize=16*1024):
projname = line.rstrip()[11:].decode('utf-8')
line = f.readline()
version = line.rstrip()[11:].decode('utf-8')
- line = f.readline()
+ line = f.readline().decode('utf-8')
if 'zlib' not in line:
raise ValueError
def read_chunks():
decompressor = zlib.decompressobj()
- for chunk in iter(lambda: f.read(bufsize), ''):
+ for chunk in iter(lambda: f.read(bufsize), b('')):
yield decompressor.decompress(chunk)
yield decompressor.flush()
def split_lines(iter):
- buf = ''
+ buf = b('')
for chunk in iter:
buf += chunk
- lineend = buf.find('\n')
+ lineend = buf.find(b('\n'))
while lineend != -1:
yield buf[:lineend].decode('utf-8')
buf = buf[lineend+1:]
- lineend = buf.find('\n')
+ lineend = buf.find(b('\n'))
assert not buf
for line in split_lines(read_chunks()):
@@ -116,7 +124,7 @@ def fetch_inventory(app, uri, inv):
'%s: %s' % (inv, err.__class__, err))
return
try:
- line = f.readline().rstrip()
+ line = f.readline().rstrip().decode('utf-8')
try:
if line == '# Sphinx inventory version 1':
invdata = read_inventory_v1(f, uri, join)
diff --git a/sphinx/ext/mathbase.py b/sphinx/ext/mathbase.py
index fc849584..6d080b4b 100644
--- a/sphinx/ext/mathbase.py
+++ b/sphinx/ext/mathbase.py
@@ -57,6 +57,7 @@ class MathDirective(Directive):
final_argument_whitespace = True
option_spec = {
'label': directives.unchanged,
+ 'name': directives.unchanged,
'nowrap': directives.flag,
}
@@ -66,7 +67,9 @@ class MathDirective(Directive):
latex = self.arguments[0] + '\n\n' + latex
node = displaymath()
node['latex'] = latex
- node['label'] = self.options.get('label', None)
+ node['label'] = self.options.get('name', None)
+ if node['label'] is None:
+ node['label'] = self.options.get('label', None)
node['nowrap'] = 'nowrap' in self.options
node['docname'] = self.state.document.settings.env.docname
ret = [node]
@@ -126,6 +129,24 @@ def man_visit_eqref(self, node):
raise nodes.SkipNode
+def texinfo_visit_math(self, node):
+ self.body.append('@math{' + self.escape_arg(node['latex']) + '}')
+ raise nodes.SkipNode
+
+def texinfo_visit_displaymath(self, node):
+ if node.get('label'):
+ self.add_anchor(node['label'], node)
+ self.body.append('\n\n@example\n%s\n@end example\n\n' %
+ self.escape_arg(node['latex']))
+def texinfo_depart_displaymath(self, node):
+ pass
+
+def texinfo_visit_eqref(self, node):
+ self.add_xref(node['docname'] + ':' + node['target'],
+ node['target'], node)
+ raise nodes.SkipNode
+
+
def html_visit_eqref(self, node):
self.body.append('<a href="#equation-%s">' % node['target'])
@@ -152,20 +173,23 @@ def number_equations(app, doctree, docname):
def setup_math(app, htmlinlinevisitors, htmldisplayvisitors):
app.add_node(math,
- latex=(latex_visit_math, None),
- text=(text_visit_math, None),
- man=(man_visit_math, None),
- html=htmlinlinevisitors)
+ latex=(latex_visit_math, None),
+ text=(text_visit_math, None),
+ man=(man_visit_math, None),
+ texinfo=(texinfo_visit_math, None),
+ html=htmlinlinevisitors)
app.add_node(displaymath,
- latex=(latex_visit_displaymath, None),
- text=(text_visit_displaymath, None),
- man=(man_visit_displaymath, man_depart_displaymath),
- html=htmldisplayvisitors)
+ latex=(latex_visit_displaymath, None),
+ text=(text_visit_displaymath, None),
+ man=(man_visit_displaymath, man_depart_displaymath),
+ texinfo=(texinfo_visit_displaymath, texinfo_depart_displaymath),
+ html=htmldisplayvisitors)
app.add_node(eqref,
- latex=(latex_visit_eqref, None),
- text=(text_visit_eqref, None),
- man=(man_visit_eqref, None),
- html=(html_visit_eqref, html_depart_eqref))
+ latex=(latex_visit_eqref, None),
+ text=(text_visit_eqref, None),
+ man=(man_visit_eqref, None),
+ texinfo=(texinfo_visit_eqref, None),
+ html=(html_visit_eqref, html_depart_eqref))
app.add_role('math', math_role)
app.add_role('eq', eq_role)
app.add_directive('math', MathDirective)
diff --git a/sphinx/ext/mathjax.py b/sphinx/ext/mathjax.py
new file mode 100644
index 00000000..7a552364
--- /dev/null
+++ b/sphinx/ext/mathjax.py
@@ -0,0 +1,68 @@
+# -*- coding: utf-8 -*-
+"""
+ sphinx.ext.mathjax
+ ~~~~~~~~~~~~~~~~~~
+
+ Allow `MathJax <http://mathjax.org/>`_ to be used to display math in
+ Sphinx's HTML writer -- requires the MathJax JavaScript library on your
+ webserver/computer.
+
+ :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
+ :license: BSD, see LICENSE for details.
+"""
+
+from docutils import nodes
+
+from sphinx.application import ExtensionError
+from sphinx.ext.mathbase import setup_math as mathbase_setup
+
+
+def html_visit_math(self, node):
+ self.body.append(self.starttag(node, 'span', '', CLASS='math'))
+ self.body.append(self.builder.config.mathjax_inline[0] +
+ self.encode(node['latex']) +
+ self.builder.config.mathjax_inline[1] + '</span>')
+ raise nodes.SkipNode
+
+def html_visit_displaymath(self, node):
+ self.body.append(self.starttag(node, 'div', CLASS='math'))
+ if node['nowrap']:
+ self.body.append(self.builder.config.mathjax_display[0] +
+ node['latex'] +
+ self.builder.config.mathjax_display[1])
+ self.body.append('</div>')
+ raise nodes.SkipNode
+
+ parts = [prt for prt in node['latex'].split('\n\n') if prt.strip()]
+ for i, part in enumerate(parts):
+ part = self.encode(part)
+ if i == 0:
+ # necessary to e.g. set the id property correctly
+ if node['number']:
+ self.body.append('<span class="eqno">(%s)</span>' %
+ node['number'])
+ if '&' in part or '\\\\' in part:
+ self.body.append(self.builder.config.mathjax_display[0] +
+ '\\begin{split}' + part + '\\end{split}' +
+ self.builder.config.mathjax_display[1])
+ else:
+ self.body.append(self.builder.config.mathjax_display[0] + part +
+ self.builder.config.mathjax_display[1])
+ self.body.append('</div>\n')
+ raise nodes.SkipNode
+
+def builder_inited(app):
+ if not app.config.mathjax_path:
+ raise ExtensionError('mathjax_path config value must be set for the '
+ 'mathjax extension to work')
+ app.add_javascript(app.config.mathjax_path)
+
+
+def setup(app):
+ mathbase_setup(app, (html_visit_math, None), (html_visit_displaymath, None))
+ app.add_config_value('mathjax_path',
+ 'http://cdn.mathjax.org/mathjax/latest/MathJax.js?'
+ 'config=TeX-AMS-MML_HTMLorMML', False)
+ app.add_config_value('mathjax_inline', [r'\(', r'\)'], 'html')
+ app.add_config_value('mathjax_display', [r'\[', r'\]'], 'html')
+ app.connect('builder-inited', builder_inited)
diff --git a/sphinx/ext/oldcmarkup.py b/sphinx/ext/oldcmarkup.py
index cfc95ba4..9dad85f4 100644
--- a/sphinx/ext/oldcmarkup.py
+++ b/sphinx/ext/oldcmarkup.py
@@ -18,6 +18,7 @@ WARNING_MSG = 'using old C markup; please migrate to new-style markup ' \
'(e.g. c:function instead of cfunction), see ' \
'http://sphinx.pocoo.org/domains.html'
+
class OldCDirective(Directive):
has_content = True
required_arguments = 1
diff --git a/sphinx/ext/pngmath.py b/sphinx/ext/pngmath.py
index 6fdfbfe7..78c331a6 100644
--- a/sphinx/ext/pngmath.py
+++ b/sphinx/ext/pngmath.py
@@ -26,6 +26,7 @@ from docutils import nodes
from sphinx.errors import SphinxError
from sphinx.util.png import read_png_depth, write_png_depth
from sphinx.util.osutil import ensuredir, ENOENT
+from sphinx.util.pycompat import b
from sphinx.ext.mathbase import setup_math as mathbase_setup, wrap_displaymath
class MathExtError(SphinxError):
@@ -58,11 +59,10 @@ DOC_BODY_PREVIEW = r'''
\end{document}
'''
-depth_re = re.compile(r'\[\d+ depth=(-?\d+)\]')
+depth_re = re.compile(b(r'\[\d+ depth=(-?\d+)\]'))
def render_math(self, math):
- """
- Render the LaTeX math expression *math* using latex and dvipng.
+ """Render the LaTeX math expression *math* using latex and dvipng.
Return the filename relative to the built document and the "depth",
that is, the distance of image bottom and baseline in pixels, if the
@@ -178,6 +178,11 @@ def cleanup_tempdir(app, exc):
except Exception:
pass
+def get_tooltip(self, node):
+ if self.builder.config.pngmath_add_tooltips:
+ return ' alt="%s"' % self.encode(node['latex']).strip()
+ return ''
+
def html_visit_math(self, node):
try:
fname, depth = render_math(self, '$'+node['latex']+'$')
@@ -193,15 +198,10 @@ def html_visit_math(self, node):
self.body.append('<span class="math">%s</span>' %
self.encode(node['latex']).strip())
else:
- if depth is None:
- self.body.append(
- '<img class="math" src="%s" alt="%s"/>' %
- (fname, self.encode(node['latex']).strip()))
- else:
- self.body.append(
- '<img class="math" src="%s" alt="%s" '
- 'style="vertical-align: %dpx"/>' %
- (fname, self.encode(node['latex']).strip(), -depth))
+ c = ('<img class="math" src="%s"' % fname) + get_tooltip(self, node)
+ if depth is not None:
+ c += ' style="vertical-align: %dpx"' % (-depth)
+ self.body.append(c + '/>')
raise nodes.SkipNode
def html_visit_displaymath(self, node):
@@ -226,8 +226,8 @@ def html_visit_displaymath(self, node):
self.body.append('<span class="math">%s</span></p>\n</div>' %
self.encode(node['latex']).strip())
else:
- self.body.append('<img src="%s" alt="%s" /></p>\n</div>' %
- (fname, self.encode(node['latex']).strip()))
+ self.body.append(('<img src="%s"' % fname) + get_tooltip(self, node)
+ + '/></p>\n</div>')
raise nodes.SkipNode
@@ -240,4 +240,5 @@ def setup(app):
['-gamma 1.5', '-D 110'], 'html')
app.add_config_value('pngmath_latex_args', [], 'html')
app.add_config_value('pngmath_latex_preamble', '', 'html')
+ app.add_config_value('pngmath_add_tooltips', True, 'html')
app.connect('build-finished', cleanup_tempdir)
diff --git a/sphinx/ext/todo.py b/sphinx/ext/todo.py
index c18d70c8..4116a2d5 100644
--- a/sphinx/ext/todo.py
+++ b/sphinx/ext/todo.py
@@ -161,7 +161,8 @@ def setup(app):
html=(visit_todo_node, depart_todo_node),
latex=(visit_todo_node, depart_todo_node),
text=(visit_todo_node, depart_todo_node),
- man=(visit_todo_node, depart_todo_node))
+ man=(visit_todo_node, depart_todo_node),
+ texinfo=(visit_todo_node, depart_todo_node))
app.add_directive('todo', Todo)
app.add_directive('todolist', TodoList)
diff --git a/sphinx/ext/viewcode.py b/sphinx/ext/viewcode.py
index 4994f125..32840f30 100644
--- a/sphinx/ext/viewcode.py
+++ b/sphinx/ext/viewcode.py
@@ -31,7 +31,11 @@ def doctree_read(app, doctree):
env._viewcode_modules[modname] = False
return
analyzer.find_tags()
- entry = analyzer.code.decode(analyzer.encoding), analyzer.tags, {}
+ if not isinstance(analyzer.code, unicode):
+ code = analyzer.code.decode(analyzer.encoding)
+ else:
+ code = analyzer.code
+ entry = code, analyzer.tags, {}
env._viewcode_modules[modname] = entry
elif entry is False:
return
@@ -94,7 +98,7 @@ def collect_pages(app):
# construct a page name for the highlighted source
pagename = '_modules/' + modname.replace('.', '/')
# highlight the source using the builder's highlighter
- highlighted = highlighter.highlight_block(code, 'python', False)
+ highlighted = highlighter.highlight_block(code, 'python', linenos=False)
# split the code into lines
lines = highlighted.splitlines()
# split off wrap markup from the first line of the actual code
diff --git a/sphinx/highlighting.py b/sphinx/highlighting.py
index 8cbd647a..bf21ac64 100644
--- a/sphinx/highlighting.py
+++ b/sphinx/highlighting.py
@@ -20,7 +20,8 @@ except ImportError:
# parser is not available on Jython
parser = None
-from sphinx.util.texescape import tex_hl_escape_map_old, tex_hl_escape_map_new
+from sphinx.util.texescape import tex_hl_escape_map_new
+from sphinx.ext import doctest
try:
import pygments
@@ -30,41 +31,19 @@ try:
from pygments.lexers import get_lexer_by_name, guess_lexer
from pygments.formatters import HtmlFormatter, LatexFormatter
from pygments.filters import ErrorToken
- from pygments.style import Style
from pygments.styles import get_style_by_name
- from pygments.styles.friendly import FriendlyStyle
- from pygments.token import Generic, Comment, Number
from pygments.util import ClassNotFound
+ from sphinx.pygments_styles import SphinxStyle, NoneStyle
except ImportError:
pygments = None
lexers = None
HtmlFormatter = LatexFormatter = None
else:
- class SphinxStyle(Style):
- """
- Like friendly, but a bit darker to enhance contrast on the green
- background.
- """
-
- background_color = '#eeffcc'
- default_style = ''
-
- styles = FriendlyStyle.styles
- styles.update({
- Generic.Output: '#333',
- Comment: 'italic #408090',
- Number: '#208050',
- })
-
- class NoneStyle(Style):
- """Style without any styling."""
lexers = dict(
none = TextLexer(),
python = PythonLexer(),
pycon = PythonConsoleLexer(),
- # the python3 option exists as of Pygments 1.0,
- # but it doesn't do any harm in previous versions
pycon3 = PythonConsoleLexer(python3=True),
rest = RstLexer(),
c = CLexer(),
@@ -73,19 +52,17 @@ else:
_lexer.add_filter('raiseonerror')
-escape_hl_chars = {ord(u'@'): u'@PYGZat[]',
- ord(u'['): u'@PYGZlb[]',
- ord(u']'): u'@PYGZrb[]'}
+escape_hl_chars = {ord(u'\\'): u'\\PYGZbs{}',
+ ord(u'{'): u'\\PYGZob{}',
+ ord(u'}'): u'\\PYGZcb{}'}
# used if Pygments is not available
_LATEX_STYLES = r'''
-\newcommand\PYGZat{@}
-\newcommand\PYGZlb{[}
-\newcommand\PYGZrb{]}
+\newcommand\PYGZbs{\char`\\}
+\newcommand\PYGZob{\char`\{}
+\newcommand\PYGZcb{\char`\}}
'''
-doctestopt_re = re.compile(r'#\s*doctest:.+$', re.MULTILINE)
-
parsing_exceptions = (SyntaxError, UnicodeEncodeError)
if sys.version_info < (2, 5):
# Python <= 2.4 raises MemoryError when parsing an
@@ -115,14 +92,16 @@ class PygmentsBridge(object):
else:
style = get_style_by_name(stylename)
self.trim_doctest_flags = trim_doctest_flags
+ self.formatter_args = {'style' : style}
if dest == 'html':
- self.fmter = {False: self.html_formatter(style=style),
- True: self.html_formatter(style=style, linenos=True)}
+ self.formatter = self.html_formatter
else:
- self.fmter = {False: self.latex_formatter(style=style,
- commandprefix='PYG'),
- True: self.latex_formatter(style=style, linenos=True,
- commandprefix='PYG')}
+ self.formatter = self.latex_formatter
+ self.formatter_args['commandprefix'] = 'PYG'
+
+ def get_formatter(self, **kwargs):
+ kwargs.update(self.formatter_args)
+ return self.formatter(**kwargs)
def unhighlighted(self, source):
if self.dest == 'html':
@@ -131,8 +110,8 @@ class PygmentsBridge(object):
# first, escape highlighting characters like Pygments does
source = source.translate(escape_hl_chars)
# then, escape all characters nonrepresentable in LaTeX
- source = source.translate(tex_hl_escape_map_old)
- return '\\begin{Verbatim}[commandchars=@\\[\\]]\n' + \
+ source = source.translate(tex_hl_escape_map_new)
+ return '\\begin{Verbatim}[commandchars=\\\\\\{\\}]\n' + \
source + '\\end{Verbatim}\n'
def try_parse(self, src):
@@ -156,7 +135,7 @@ class PygmentsBridge(object):
if sys.version_info >= (2, 5):
src = 'from __future__ import with_statement\n' + src
- if isinstance(src, unicode):
+ if sys.version_info < (3, 0) and isinstance(src, unicode):
# Non-ASCII chars will only occur in string literals
# and comments. If we wanted to give them to the parser
# correctly, we'd have to find out the correct source
@@ -174,8 +153,8 @@ class PygmentsBridge(object):
else:
return True
- def highlight_block(self, source, lang, linenos=False, warn=None):
- if isinstance(source, str):
+ def highlight_block(self, source, lang, warn=None, **kwargs):
+ if not isinstance(source, unicode):
source = source.decode()
if not pygments:
return self.unhighlighted(source)
@@ -216,18 +195,17 @@ class PygmentsBridge(object):
# trim doctest options if wanted
if isinstance(lexer, PythonConsoleLexer) and self.trim_doctest_flags:
- source = doctestopt_re.sub('', source)
+ source = doctest.blankline_re.sub('', source)
+ source = doctest.doctestopt_re.sub('', source)
# highlight via Pygments
try:
+ formatter = self.get_formatter(**kwargs)
+ hlsource = highlight(source, lexer, formatter)
if self.dest == 'html':
- return highlight(source, lexer, self.fmter[bool(linenos)])
+ return hlsource
else:
- hlsource = highlight(source, lexer, self.fmter[bool(linenos)])
- if hlsource.startswith(r'\begin{Verbatim}[commandchars=\\\{\}'):
- # Pygments >= 1.2
- return hlsource.translate(tex_hl_escape_map_new)
- return hlsource.translate(tex_hl_escape_map_old)
+ return hlsource.translate(tex_hl_escape_map_new)
except ErrorToken:
# this is most probably not the selected language,
# so let it pass unhighlighted
@@ -239,11 +217,8 @@ class PygmentsBridge(object):
return _LATEX_STYLES
# no HTML styles needed
return ''
+ formatter = self.get_formatter()
if self.dest == 'html':
- return self.fmter[0].get_style_defs('.highlight')
+ return formatter.get_style_defs('.highlight')
else:
- styledefs = self.fmter[0].get_style_defs()
- # workaround for Pygments < 0.12
- if styledefs.startswith('\\newcommand\\at{@}'):
- styledefs += _LATEX_STYLES
- return styledefs
+ return formatter.get_style_defs()
diff --git a/sphinx/jinja2glue.py b/sphinx/jinja2glue.py
index c952a117..ffe3a0b3 100644
--- a/sphinx/jinja2glue.py
+++ b/sphinx/jinja2glue.py
@@ -26,6 +26,12 @@ def _tobool(val):
return val.lower() in ('true', '1', 'yes', 'on')
return bool(val)
+def _toint(val):
+ try:
+ return int(val)
+ except ValueError:
+ return 0
+
def accesskey(context, key):
"""Helper to output each access key only once."""
if '_accesskeys' not in context:
@@ -40,14 +46,17 @@ class idgen(object):
self.id = 0
def current(self):
return self.id
- def next(self):
+ def __next__(self):
self.id += 1
return self.id
+ next = __next__ # Python 2/Jinja compatibility
class SphinxFileSystemLoader(FileSystemLoader):
- """FileSystemLoader subclass that is not so strict about '..'
- entries in template names."""
+ """
+ FileSystemLoader subclass that is not so strict about '..' entries in
+ template names.
+ """
def get_source(self, environment, template):
for searchpath in self.searchpath:
@@ -107,6 +116,7 @@ class BuiltinTemplateLoader(TemplateBridge, BaseLoader):
self.environment = SandboxedEnvironment(loader=self,
extensions=extensions)
self.environment.filters['tobool'] = _tobool
+ self.environment.filters['toint'] = _toint
self.environment.globals['debug'] = contextfunction(pformat)
self.environment.globals['accesskey'] = contextfunction(accesskey)
self.environment.globals['idgen'] = idgen
diff --git a/sphinx/locale/__init__.py b/sphinx/locale/__init__.py
index e40a7eab..3aca780c 100644
--- a/sphinx/locale/__init__.py
+++ b/sphinx/locale/__init__.py
@@ -8,13 +8,16 @@
:copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
:license: BSD, see LICENSE for details.
"""
+
+import sys
import gettext
import UserString
class _TranslationProxy(UserString.UserString, object):
- """Class for proxy strings from gettext translations. This is a helper
- for the lazy_* functions from this module.
+ """
+ Class for proxy strings from gettext translations. This is a helper for the
+ lazy_* functions from this module.
The proxy implementation attempts to be as complete as possible, so that
the lazy objects should mostly work as expected, for example for sorting.
@@ -135,7 +138,8 @@ class _TranslationProxy(UserString.UserString, object):
def mygettext(string):
"""Used instead of _ when creating TranslationProxies, because _ is
- not bound yet at that time."""
+ not bound yet at that time.
+ """
return _(string)
def lazy_gettext(string):
@@ -166,6 +170,7 @@ versionlabels = {
'deprecated': l_('Deprecated since version %s'),
}
+# XXX Python specific
pairindextypes = {
'module': l_('module'),
'keyword': l_('keyword'),
@@ -176,18 +181,32 @@ pairindextypes = {
'builtin': l_('built-in function'),
}
-translator = None
+translators = {}
-def _(message):
- return translator.ugettext(message)
+if sys.version_info >= (3, 0):
+ def _(message):
+ return translators['sphinx'].gettext(message)
+else:
+ def _(message):
+ return translators['sphinx'].ugettext(message)
-def init(locale_dirs, language):
- global translator
+
+def init(locale_dirs, language, catalog='sphinx'):
+ """Look for message catalogs in `locale_dirs` and *ensure* that there is at
+ least a NullTranslations catalog set in `translators`. If called multiple
+ times or if several ``.mo`` files are found, their contents are merged
+ together (thus making ``init`` reentrable).
+ """
+ global translators
+ translator = translators.get(catalog)
+ # ignore previously failed attempts to find message catalogs
+ if isinstance(translator, gettext.NullTranslations):
+ translator = None
# the None entry is the system's default locale path
has_translation = True
for dir_ in locale_dirs:
try:
- trans = gettext.translation('sphinx', localedir=dir_,
+ trans = gettext.translation(catalog, localedir=dir_,
languages=[language])
if translator is None:
translator = trans
@@ -196,7 +215,11 @@ def init(locale_dirs, language):
except Exception:
# Language couldn't be found in the specified path
pass
+ # guarantee translations[catalog] exists
if translator is None:
translator = gettext.NullTranslations()
has_translation = False
+ translators[catalog] = translator
+ if hasattr(translator, 'ugettext'):
+ translator.gettext = translator.ugettext
return translator, has_translation
diff --git a/sphinx/locale/bn/LC_MESSAGES/sphinx.js b/sphinx/locale/bn/LC_MESSAGES/sphinx.js
index 277cd3d0..a69d00b5 100644
--- a/sphinx/locale/bn/LC_MESSAGES/sphinx.js
+++ b/sphinx/locale/bn/LC_MESSAGES/sphinx.js
@@ -1 +1 @@
-Documentation.addTranslations({"locale": "bn", "plural_expr": "(n != 1)", "messages": {"Search Results": "\u0985\u09a8\u09c1\u09b8\u09a8\u09cd\u09a7\u09be\u09a8\u09c7\u09b0 \u09ab\u09b2\u09be\u09ab\u09b2", "Preparing search...": "\u0985\u09a8\u09c1\u09b8\u09a8\u09cd\u09a7\u09be\u09a8\u09c7\u09b0 \u09aa\u09cd\u09b0\u09b8\u09cd\u09a4\u09c1\u09a4\u09bf \u099a\u09b2\u099b\u09c7...", "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "\u0986\u09aa\u09a8\u09be\u09b0 \u0985\u09a8\u09c1\u09b8\u09a8\u09cd\u09a7\u09be\u09a8\u09c7 \u0995\u09c7\u09be\u09a8 \u09ab\u09b2\u09be\u09ab\u09b2 \u09aa\u09be\u0993\u09df\u09be \u09af\u09be\u09df\u09a8\u09bf\u0964 \u0986\u09aa\u09a8\u09be\u09b0 \u0985\u09a8\u09c1\u09b8\u09a8\u09cd\u09a7\u09be\u09a8\u09c7\u09b0 \u09b6\u09ac\u09cd\u09a6\u0997\u09c1\u09b2\u09c7\u09be\u09b0 \u09b8\u09a0\u09bf\u0995 \u09ac\u09be\u09a8\u09be\u09a8 \u0993 \u09ac\u09bf\u09ad\u09be\u0997 \u09a8\u09bf\u09b0\u09cd\u09ac\u09be\u099a\u09a8 \u09a8\u09bf\u09b6\u09cd\u099a\u09bf\u09a4 \u0995\u09b0\u09c1\u09a8\u0964", "Search finished, found %s page(s) matching the search query.": "\u0985\u09a8\u09c1\u09b8\u09a8\u09cd\u09a7\u09be\u09a8 \u09b6\u09c7\u09b7 \u09b9\u09df\u09c7\u099b\u09c7, \u09ab\u09b2\u09be\u09ab\u09b2\u09c7 %s-\u099f\u09bf \u09aa\u09be\u09a4\u09be \u09aa\u09be\u0993\u09df\u09be \u0997\u09c7\u099b\u09c7\u0964", ", in ": ", -", "Permalink to this headline": "\u098f\u0987 \u09b6\u09bf\u09b0\u09c7\u09be\u09a8\u09be\u09ae\u09c7\u09b0 \u09aa\u09be\u09b0\u09cd\u09ae\u09be\u09b2\u09bf\u0999\u09cd\u0995", "Searching": "\u0985\u09a8\u09c1\u09b8\u09a8\u09cd\u09a7\u09be\u09a8 \u099a\u09b2\u099b\u09c7", "Permalink to this definition": "\u098f\u0987 \u09b8\u0982\u099c\u09cd\u099e\u09be\u09b0 \u09aa\u09be\u09b0\u09cd\u09ae\u09be\u09b2\u09bf\u0999\u09cd\u0995", "Hide Search Matches": "\u0985\u09a8\u09c1\u09b8\u09a8\u09cd\u09a7\u09be\u09a8\u09c7\u09b0 \u09ae\u09cd\u09af\u09be\u099a\u0997\u09c1\u09b2\u09c7\u09be \u09b2\u09c1\u0995\u09be\u09a8"}}); \ No newline at end of file
+Documentation.addTranslations({"locale": "bn", "plural_expr": "(n != 1)", "messages": {"Hide Search Matches": "\u0985\u09a8\u09c1\u09b8\u09a8\u09cd\u09a7\u09be\u09a8\u09c7\u09b0 \u09ae\u09cd\u09af\u09be\u099a\u0997\u09c1\u09b2\u09c7\u09be \u09b2\u09c1\u0995\u09be\u09a8", "Permalink to this definition": "\u098f\u0987 \u09b8\u0982\u099c\u09cd\u099e\u09be\u09b0 \u09aa\u09be\u09b0\u09cd\u09ae\u09be\u09b2\u09bf\u0999\u09cd\u0995", "Expand sidebar": "", "Permalink to this headline": "\u098f\u0987 \u09b6\u09bf\u09b0\u09c7\u09be\u09a8\u09be\u09ae\u09c7\u09b0 \u09aa\u09be\u09b0\u09cd\u09ae\u09be\u09b2\u09bf\u0999\u09cd\u0995", "Collapse sidebar": ""}}); \ No newline at end of file
diff --git a/sphinx/locale/bn/LC_MESSAGES/sphinx.mo b/sphinx/locale/bn/LC_MESSAGES/sphinx.mo
index 9b60397e..cb06ba98 100644
--- a/sphinx/locale/bn/LC_MESSAGES/sphinx.mo
+++ b/sphinx/locale/bn/LC_MESSAGES/sphinx.mo
Binary files differ
diff --git a/sphinx/locale/bn/LC_MESSAGES/sphinx.po b/sphinx/locale/bn/LC_MESSAGES/sphinx.po
index d5141c79..49549939 100644
--- a/sphinx/locale/bn/LC_MESSAGES/sphinx.po
+++ b/sphinx/locale/bn/LC_MESSAGES/sphinx.po
@@ -1,4 +1,4 @@
-# Translations template for Sphinx.
+# Bengali translations for Sphinx.
# Copyright (C) 2009 ORGANIZATION
# This file is distributed under the same license as the Sphinx project.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2009.
@@ -7,520 +7,607 @@ msgid ""
msgstr ""
"Project-Id-Version: Sphinx 1.0pre/[?1034h2e1ab15e035e\n"
"Report-Msgid-Bugs-To: nasim.haque@gmail.com\n"
-"POT-Creation-Date: 2009-11-08 16:28+0100\n"
-"PO-Revision-Date: 2009-11-10 13:42+0100\n"
+"POT-Creation-Date: 2011-09-21 10:06+0200\n"
+"PO-Revision-Date: 2011-09-21 10:08+0200\n"
"Last-Translator: Nasimul Haque <nasim.haque@gmail.com>\n"
"Language-Team: Nasimul Haque <nasim.haque@gmail.com>\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"
+"Generated-By: Babel 0.9.6\n"
-#: sphinx/environment.py:130
-#: sphinx/writers/latex.py:184
+#: sphinx/config.py:81
+#, python-format
+msgid "%s %s documentation"
+msgstr ""
+
+#: sphinx/environment.py:119 sphinx/writers/latex.py:190
+#: sphinx/writers/manpage.py:67 sphinx/writers/texinfo.py:203
#, python-format
msgid "%B %d, %Y"
msgstr "%B %d, %Y"
-#: sphinx/environment.py:348
-#: sphinx/themes/basic/genindex-single.html:2
-#: sphinx/themes/basic/genindex-split.html:2
-#: sphinx/themes/basic/genindex-split.html:5
-#: sphinx/themes/basic/genindex.html:2
-#: sphinx/themes/basic/genindex.html:5
-#: sphinx/themes/basic/genindex.html:48
-#: sphinx/themes/basic/layout.html:134
-#: sphinx/writers/latex.py:190
-msgid "Index"
-msgstr "ইনডেক্স"
-
-#: sphinx/environment.py:349
-#: sphinx/writers/latex.py:189
-msgid "Module Index"
-msgstr "মডিউল ইনডেক্স"
+#: sphinx/environment.py:1625
+#, fuzzy, python-format
+msgid "see %s"
+msgstr "আরও %s"
-#: sphinx/environment.py:350
-#: sphinx/themes/basic/defindex.html:16
-msgid "Search Page"
-msgstr "অনুসন্ধান পাতা"
+#: sphinx/environment.py:1628
+#, fuzzy, python-format
+msgid "see also %s"
+msgstr "আরও দেখুন %s"
-#: sphinx/roles.py:167
+#: sphinx/roles.py:175
#, python-format
-msgid "Python Enhancement Proposals!PEP %s"
-msgstr "পাইথন উন্নয়ন পরামর্শ!PEP %s"
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr "পাইথন উন্নয়ন পরামর্শ; PEP %s"
-#: sphinx/builders/changes.py:70
+#: sphinx/builders/changes.py:73
msgid "Builtins"
msgstr "বিল্টইন সমূহ"
-#: sphinx/builders/changes.py:72
+#: sphinx/builders/changes.py:75
msgid "Module level"
msgstr "মডিউল লেভেল"
-#: sphinx/builders/html.py:224
+#: sphinx/builders/html.py:274
#, python-format
msgid "%b %d, %Y"
msgstr "%b %d, %Y"
-#: sphinx/builders/html.py:243
-#: sphinx/themes/basic/defindex.html:21
+#: sphinx/builders/html.py:293 sphinx/themes/basic/defindex.html:30
msgid "General Index"
msgstr "সাধারণ ইনডেক্স"
-#: sphinx/builders/html.py:243
+#: sphinx/builders/html.py:293
msgid "index"
msgstr "ইনডেক্স"
-#: sphinx/builders/html.py:247
-#: sphinx/builders/htmlhelp.py:220
-#: sphinx/builders/qthelp.py:133
-#: sphinx/themes/basic/defindex.html:19
-#: sphinx/themes/basic/modindex.html:2
-#: sphinx/themes/basic/modindex.html:13
-#: sphinx/themes/scrolls/modindex.html:2
-#: sphinx/themes/scrolls/modindex.html:13
-msgid "Global Module Index"
-msgstr "গ্লোবাল মডিউল ইনডেক্স"
-
-#: sphinx/builders/html.py:248
-msgid "modules"
-msgstr "মডিউল সমূহ"
-
-#: sphinx/builders/html.py:304
+#: sphinx/builders/html.py:353
msgid "next"
msgstr "পরবর্তী"
-#: sphinx/builders/html.py:313
+#: sphinx/builders/html.py:362
msgid "previous"
msgstr "পূর্ববর্তী"
-#: sphinx/builders/latex.py:162
+#: sphinx/builders/latex.py:141 sphinx/builders/texinfo.py:196
msgid " (in "
msgstr "(-"
-#: sphinx/directives/__init__.py:78
-#: sphinx/directives/__init__.py:79
-#: sphinx/directives/__init__.py:80
-#: sphinx/directives/__init__.py:81
-msgid "Raises"
-msgstr "রেইজেস"
-
-#: sphinx/directives/__init__.py:82
-#: sphinx/directives/__init__.py:83
-#: sphinx/directives/__init__.py:84
-msgid "Variable"
-msgstr "ভ্যারিয়েবল"
-
-#: sphinx/directives/__init__.py:85
-#: sphinx/directives/__init__.py:86
-#: sphinx/directives/__init__.py:92
-#: sphinx/directives/__init__.py:93
-msgid "Returns"
-msgstr "রিটার্নস"
-
-#: sphinx/directives/__init__.py:94
-msgid "Return type"
-msgstr "রিটার্ন টাইপ"
-
-#: sphinx/directives/__init__.py:169
-msgid "Parameter"
-msgstr "প্যারামিটার"
-
-#: sphinx/directives/__init__.py:173
-msgid "Parameters"
-msgstr "প্যারামিটার"
-
-#: sphinx/directives/other.py:127
+#: sphinx/directives/other.py:136
msgid "Section author: "
msgstr "অনুচ্ছেদ লেখক:"
-#: sphinx/directives/other.py:129
+#: sphinx/directives/other.py:138
msgid "Module author: "
msgstr "মডিউল লেখক:"
-#: sphinx/directives/other.py:131
+#: sphinx/directives/other.py:140
+#, fuzzy
+msgid "Code author: "
+msgstr "মডিউল লেখক:"
+
+#: sphinx/directives/other.py:142
msgid "Author: "
msgstr "লেখক:"
-#: sphinx/directives/other.py:233
+#: sphinx/directives/other.py:215
msgid "See also"
msgstr "আরও দেখুন"
-#: sphinx/domains/c.py:124
+#: sphinx/domains/__init__.py:244
+#, python-format
+msgid "%s %s"
+msgstr ""
+
+#: sphinx/domains/c.py:51 sphinx/domains/python.py:95
+msgid "Parameters"
+msgstr "প্যারামিটার"
+
+#: sphinx/domains/c.py:54 sphinx/domains/javascript.py:128
+#: sphinx/domains/python.py:107
+msgid "Returns"
+msgstr "রিটার্নস"
+
+#: sphinx/domains/c.py:56 sphinx/domains/python.py:109
+msgid "Return type"
+msgstr "রিটার্ন টাইপ"
+
+#: sphinx/domains/c.py:141
#, python-format
msgid "%s (C function)"
msgstr "%s (C ফাংশন)"
-#: sphinx/domains/c.py:126
+#: sphinx/domains/c.py:143
#, python-format
msgid "%s (C member)"
msgstr "%s (C মেম্বার)"
-#: sphinx/domains/c.py:128
+#: sphinx/domains/c.py:145
#, python-format
msgid "%s (C macro)"
msgstr "%s (C ম্যাক্রো)"
-#: sphinx/domains/c.py:130
+#: sphinx/domains/c.py:147
#, python-format
msgid "%s (C type)"
msgstr "%s (C টাইপ)"
-#: sphinx/domains/c.py:132
+#: sphinx/domains/c.py:149
#, python-format
msgid "%s (C variable)"
msgstr "%s (C ভ্যারিয়েবল)"
-#: sphinx/domains/c.py:162
-msgid "C function"
-msgstr "C ফাংশন"
+#: sphinx/domains/c.py:204 sphinx/domains/cpp.py:1060
+#: sphinx/domains/javascript.py:162 sphinx/domains/python.py:559
+msgid "function"
+msgstr "ফাংশন"
-#: sphinx/domains/c.py:163
-msgid "C member"
+#: sphinx/domains/c.py:205 sphinx/domains/cpp.py:1061
+#, fuzzy
+msgid "member"
msgstr "C মেম্বার"
-#: sphinx/domains/c.py:164
-msgid "C macro"
+#: sphinx/domains/c.py:206
+#, fuzzy
+msgid "macro"
msgstr "C ম্যাক্রো"
-#: sphinx/domains/c.py:165
-msgid "C type"
+#: sphinx/domains/c.py:207 sphinx/domains/cpp.py:1062
+#, fuzzy
+msgid "type"
msgstr "C টাইপ"
-#: sphinx/domains/c.py:166
-msgid "C variable"
+#: sphinx/domains/c.py:208
+#, fuzzy
+msgid "variable"
msgstr "C ভ্যারিয়েবল"
-#: sphinx/domains/python.py:186
+#: sphinx/domains/cpp.py:904
+#, python-format
+msgid "%s (C++ class)"
+msgstr "%s (C++ ক্লাসে)"
+
+#: sphinx/domains/cpp.py:919
+#, python-format
+msgid "%s (C++ type)"
+msgstr "%s (C++ টাইপ)"
+
+#: sphinx/domains/cpp.py:938
+#, python-format
+msgid "%s (C++ member)"
+msgstr "%s (C++ মেম্বার)"
+
+#: sphinx/domains/cpp.py:990
+#, python-format
+msgid "%s (C++ function)"
+msgstr "%s (C++ ফাংশন)"
+
+#: sphinx/domains/cpp.py:1059 sphinx/domains/javascript.py:163
+#: sphinx/domains/python.py:561
+msgid "class"
+msgstr "ক্লাস"
+
+#: sphinx/domains/javascript.py:106 sphinx/domains/python.py:254
#, python-format
msgid "%s() (built-in function)"
msgstr "%s() (বিল্ট-ইন ফাংশন)"
-#: sphinx/domains/python.py:187
-#: sphinx/domains/python.py:244
-#: sphinx/domains/python.py:256
-#: sphinx/domains/python.py:269
+#: sphinx/domains/javascript.py:107 sphinx/domains/python.py:318
+#, python-format
+msgid "%s() (%s method)"
+msgstr "%s() (%s মেথড)"
+
+#: sphinx/domains/javascript.py:109
+#, python-format
+msgid "%s() (class)"
+msgstr "%s() (ক্লাসে)"
+
+#: sphinx/domains/javascript.py:111
+#, python-format
+msgid "%s (global variable or constant)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:113 sphinx/domains/python.py:356
+#, python-format
+msgid "%s (%s attribute)"
+msgstr "%s (%s এ্যট্রিবিউট)"
+
+#: sphinx/domains/javascript.py:122
+#, fuzzy
+msgid "Arguments"
+msgstr "প্যারামিটার"
+
+#: sphinx/domains/javascript.py:125
+msgid "Throws"
+msgstr ""
+
+#: sphinx/domains/javascript.py:164 sphinx/domains/python.py:560
+msgid "data"
+msgstr "ডাটা"
+
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:566
+msgid "attribute"
+msgstr "এ্যট্রিবিউট"
+
+#: sphinx/domains/python.py:100
+#, fuzzy
+msgid "Variables"
+msgstr "ভ্যারিয়েবল"
+
+#: sphinx/domains/python.py:104
+msgid "Raises"
+msgstr "রেইজেস"
+
+#: sphinx/domains/python.py:255 sphinx/domains/python.py:312
+#: sphinx/domains/python.py:324 sphinx/domains/python.py:337
#, python-format
msgid "%s() (in module %s)"
msgstr "%s() (%s মডিউলে)"
-#: sphinx/domains/python.py:190
+#: sphinx/domains/python.py:258
#, python-format
msgid "%s (built-in variable)"
msgstr "%s (বিল্ট-ইন ভ্যারিয়েবল)"
-#: sphinx/domains/python.py:191
-#: sphinx/domains/python.py:282
+#: sphinx/domains/python.py:259 sphinx/domains/python.py:350
#, python-format
msgid "%s (in module %s)"
msgstr "%s (%s মডিউলে)"
-#: sphinx/domains/python.py:207
+#: sphinx/domains/python.py:275
#, python-format
msgid "%s (built-in class)"
msgstr "%s (বিল্ট-ইন ক্লাস)"
-#: sphinx/domains/python.py:208
+#: sphinx/domains/python.py:276
#, python-format
msgid "%s (class in %s)"
msgstr "%s (%s ক্লাসে)"
-#: sphinx/domains/python.py:248
+#: sphinx/domains/python.py:316
#, python-format
msgid "%s() (%s.%s method)"
msgstr "%s (%s.%s মেথড)"
-#: sphinx/domains/python.py:250
-#, python-format
-msgid "%s() (%s method)"
-msgstr "%s() (%s মেথড)"
-
-#: sphinx/domains/python.py:260
+#: sphinx/domains/python.py:328
#, python-format
msgid "%s() (%s.%s static method)"
msgstr "%s (%s.%s স্ট্যাটিক মেথড)"
-#: sphinx/domains/python.py:263
+#: sphinx/domains/python.py:331
#, python-format
msgid "%s() (%s static method)"
msgstr "%s() (%s স্ট্যাটিক মেথড)"
-#: sphinx/domains/python.py:273
+#: sphinx/domains/python.py:341
#, python-format
msgid "%s() (%s.%s class method)"
msgstr "%s() (%s.%s ক্লাস মেথড)"
-#: sphinx/domains/python.py:276
+#: sphinx/domains/python.py:344
#, python-format
msgid "%s() (%s class method)"
msgstr "%s() (%s ক্লাস মেথড)"
-#: sphinx/domains/python.py:286
+#: sphinx/domains/python.py:354
#, python-format
msgid "%s (%s.%s attribute)"
msgstr "%s (%s.%s এ্যট্রিবিউট)"
-#: sphinx/domains/python.py:288
-#, python-format
-msgid "%s (%s attribute)"
-msgstr "%s (%s এ্যট্রিবিউট)"
-
-#: sphinx/domains/python.py:334
-msgid "Platforms: "
-msgstr "প্লাটফরম:"
-
-#: sphinx/domains/python.py:340
+#: sphinx/domains/python.py:434
#, python-format
msgid "%s (module)"
msgstr "%s (মডিউল)"
-#: sphinx/domains/python.py:396
-msgid "function"
-msgstr "ফাংশন"
+#: sphinx/domains/python.py:491
+#, fuzzy
+msgid "Python Module Index"
+msgstr "মডিউল ইনডেক্স"
-#: sphinx/domains/python.py:397
-msgid "data"
-msgstr "ডাটা"
+#: sphinx/domains/python.py:492
+msgid "modules"
+msgstr "মডিউল সমূহ"
-#: sphinx/domains/python.py:398
-msgid "class"
-msgstr "ক্লাস"
+#: sphinx/domains/python.py:537
+msgid "Deprecated"
+msgstr "ডেপ্রিকেটেড"
-#: sphinx/domains/python.py:399
-#: sphinx/locale/__init__.py:161
+#: sphinx/domains/python.py:562 sphinx/locale/__init__.py:179
msgid "exception"
msgstr "এক্সেপশন"
-#: sphinx/domains/python.py:400
+#: sphinx/domains/python.py:563
msgid "method"
msgstr "মেথড"
-#: sphinx/domains/python.py:401
-msgid "attribute"
-msgstr "এ্যট্রিবিউট"
+#: sphinx/domains/python.py:564
+msgid "class method"
+msgstr "ক্লাস মেথড"
-#: sphinx/domains/python.py:402
-#: sphinx/locale/__init__.py:157
+#: sphinx/domains/python.py:565
+msgid "static method"
+msgstr "স্ট্যাটিক মেথড"
+
+#: sphinx/domains/python.py:567 sphinx/locale/__init__.py:175
msgid "module"
msgstr "মডিউল"
-#: sphinx/domains/std.py:67
-#: sphinx/domains/std.py:83
+#: sphinx/domains/python.py:695
+#, fuzzy
+msgid " (deprecated)"
+msgstr "ডেপ্রিকেটেড"
+
+#: sphinx/domains/rst.py:55
+#, python-format
+msgid "%s (directive)"
+msgstr ""
+
+#: sphinx/domains/rst.py:57
+#, fuzzy, python-format
+msgid "%s (role)"
+msgstr "%s (মডিউল)"
+
+#: sphinx/domains/rst.py:106
+msgid "directive"
+msgstr ""
+
+#: sphinx/domains/rst.py:107
+#, fuzzy
+msgid "role"
+msgstr "মডিউল"
+
+#: sphinx/domains/std.py:70 sphinx/domains/std.py:86
#, python-format
msgid "environment variable; %s"
msgstr "এনভায়রনমেন্ট ভ্যারিয়েবল; %s"
-#: sphinx/domains/std.py:156
+#: sphinx/domains/std.py:162
#, python-format
msgid "%scommand line option; %s"
msgstr "%sকমান্ড লাইন অপশন; %s"
-#: sphinx/domains/std.py:324
+#: sphinx/domains/std.py:393
msgid "glossary term"
msgstr "শব্দকোষ"
-#: sphinx/domains/std.py:325
+#: sphinx/domains/std.py:394
msgid "grammar token"
msgstr "ব্যকরণ টোকেন"
-#: sphinx/domains/std.py:326
+#: sphinx/domains/std.py:395
+msgid "reference label"
+msgstr ""
+
+#: sphinx/domains/std.py:396
msgid "environment variable"
msgstr "এনভায়রনমেন্ট ভ্যারিয়েবল"
-#: sphinx/domains/std.py:327
+#: sphinx/domains/std.py:397
msgid "program option"
msgstr "প্রোগ্রাম অপশন"
-#: sphinx/ext/autodoc.py:892
+#: sphinx/domains/std.py:427 sphinx/themes/basic/genindex-single.html:32
+#: sphinx/themes/basic/genindex-split.html:11
+#: sphinx/themes/basic/genindex-split.html:14
+#: sphinx/themes/basic/genindex.html:32 sphinx/themes/basic/genindex.html:35
+#: sphinx/themes/basic/genindex.html:68 sphinx/themes/basic/layout.html:134
+#: sphinx/writers/latex.py:179 sphinx/writers/texinfo.py:456
+msgid "Index"
+msgstr "ইনডেক্স"
+
+#: sphinx/domains/std.py:428
+msgid "Module Index"
+msgstr "মডিউল ইনডেক্স"
+
+#: sphinx/domains/std.py:429 sphinx/themes/basic/defindex.html:25
+msgid "Search Page"
+msgstr "অনুসন্ধান পাতা"
+
+#: sphinx/ext/autodoc.py:1002
#, python-format
msgid " Bases: %s"
msgstr "বেস: %s"
-#: sphinx/ext/autodoc.py:925
+#: sphinx/ext/autodoc.py:1038
#, python-format
msgid "alias of :class:`%s`"
msgstr ":class:`%s` এর উপনাম"
-#: sphinx/ext/todo.py:40
+#: sphinx/ext/todo.py:41
msgid "Todo"
msgstr "অসমাপ্ত কাজ"
-#: sphinx/ext/todo.py:98
+#: sphinx/ext/todo.py:109
+#, fuzzy, python-format
+msgid "(The <<original entry>> is located in %s, line %d.)"
+msgstr "(%s, %d লাইনে মূল অন্তর্ভুক্তিটি রয়েছে.)"
+
+#: sphinx/ext/todo.py:117
+msgid "original entry"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:70
+msgid "[source]"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:117
+msgid "[docs]"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:131
+#, fuzzy
+msgid "Module code"
+msgstr "মডিউল"
+
+#: sphinx/ext/viewcode.py:137
#, python-format
-msgid "(The original entry is located in %s, line %d and can be found "
-msgstr "(%s, %d লাইনে মূল অন্তর্ভুক্তিটি রয়েছে, যা পাওয়া যাবে"
+msgid "<h1>Source code for %s</h1>"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:164
+msgid "Overview: module code"
+msgstr ""
-#: sphinx/ext/todo.py:104
-msgid "here"
-msgstr "এখানে"
+#: sphinx/ext/viewcode.py:165
+msgid "<h1>All modules for which code is available</h1>"
+msgstr ""
-#: sphinx/locale/__init__.py:138
+#: sphinx/locale/__init__.py:155
msgid "Attention"
msgstr "দৃষ্টি আকর্ষণ"
-#: sphinx/locale/__init__.py:139
+#: sphinx/locale/__init__.py:156
msgid "Caution"
msgstr "সতর্কীকরণ"
-#: sphinx/locale/__init__.py:140
+#: sphinx/locale/__init__.py:157
msgid "Danger"
msgstr "বিপজ্জনক"
-#: sphinx/locale/__init__.py:141
+#: sphinx/locale/__init__.py:158
msgid "Error"
msgstr "ভুল (এরর)"
-#: sphinx/locale/__init__.py:142
+#: sphinx/locale/__init__.py:159
msgid "Hint"
msgstr "আভাস"
-#: sphinx/locale/__init__.py:143
+#: sphinx/locale/__init__.py:160
msgid "Important"
msgstr "গুরুত্বপূর্ণ"
-#: sphinx/locale/__init__.py:144
+#: sphinx/locale/__init__.py:161
msgid "Note"
msgstr "নোট"
-#: sphinx/locale/__init__.py:145
+#: sphinx/locale/__init__.py:162
msgid "See Also"
msgstr "আরও দেখুন"
-#: sphinx/locale/__init__.py:146
+#: sphinx/locale/__init__.py:163
msgid "Tip"
msgstr "পরামর্শ"
-#: sphinx/locale/__init__.py:147
+#: sphinx/locale/__init__.py:164
msgid "Warning"
msgstr "সতর্কতা"
-#: sphinx/locale/__init__.py:151
+#: sphinx/locale/__init__.py:168
#, python-format
msgid "New in version %s"
msgstr "%s ভার্সনে নতুন"
-#: sphinx/locale/__init__.py:152
+#: sphinx/locale/__init__.py:169
#, python-format
msgid "Changed in version %s"
msgstr "%s ভার্সনে পরিবর্তিত"
-#: sphinx/locale/__init__.py:153
+#: sphinx/locale/__init__.py:170
#, python-format
msgid "Deprecated since version %s"
msgstr "%s ভার্সন থেকে ডেপ্রিকেটেড"
-#: sphinx/locale/__init__.py:158
+#: sphinx/locale/__init__.py:176
msgid "keyword"
msgstr "কিওয়ার্ড"
-#: sphinx/locale/__init__.py:159
+#: sphinx/locale/__init__.py:177
msgid "operator"
msgstr "অপারেটর"
-#: sphinx/locale/__init__.py:160
+#: sphinx/locale/__init__.py:178
msgid "object"
msgstr "অবজেক্ট"
-#: sphinx/locale/__init__.py:162
+#: sphinx/locale/__init__.py:180
msgid "statement"
msgstr "স্ট্যাটমেন্ট"
-#: sphinx/locale/__init__.py:163
+#: sphinx/locale/__init__.py:181
msgid "built-in function"
msgstr "বিল্ট-ইন ফাংশন"
-#: sphinx/themes/basic/defindex.html:2
+#: sphinx/themes/agogo/layout.html:45 sphinx/themes/basic/globaltoc.html:10
+#: sphinx/themes/basic/localtoc.html:11
+msgid "Table Of Contents"
+msgstr "সূচীপত্র"
+
+#: sphinx/themes/agogo/layout.html:49 sphinx/themes/basic/layout.html:137
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:20
+msgid "Search"
+msgstr "অনুসন্ধান"
+
+#: sphinx/themes/agogo/layout.html:52 sphinx/themes/basic/searchbox.html:15
+msgid "Go"
+msgstr "যান"
+
+#: sphinx/themes/agogo/layout.html:57 sphinx/themes/basic/searchbox.html:20
+msgid "Enter search terms or a module, class or function name."
+msgstr "অনুসন্ধানের জন্য টার্ম, মডিউল, ক্লাস অথবা ফাংশনের নাম দিন।"
+
+#: sphinx/themes/agogo/layout.html:78 sphinx/themes/basic/sourcelink.html:14
+msgid "Show Source"
+msgstr "সোর্স দেখুন"
+
+#: sphinx/themes/basic/defindex.html:11
msgid "Overview"
msgstr "ভুমিকা"
-#: sphinx/themes/basic/defindex.html:11
+#: sphinx/themes/basic/defindex.html:20
msgid "Indices and tables:"
msgstr "ইনডেক্স ও টেবিল সমূহ:"
-#: sphinx/themes/basic/defindex.html:14
+#: sphinx/themes/basic/defindex.html:23
msgid "Complete Table of Contents"
msgstr "পূর্ণাঙ্গ সূচীপত্র"
-#: sphinx/themes/basic/defindex.html:15
+#: sphinx/themes/basic/defindex.html:24
msgid "lists all sections and subsections"
msgstr "সকল অনুচ্ছেদ সমূহের তালিকা"
-#: sphinx/themes/basic/defindex.html:17
+#: sphinx/themes/basic/defindex.html:26
msgid "search this documentation"
msgstr "এই সহায়িকাতে অনুসন্ধা করুন"
-#: sphinx/themes/basic/defindex.html:20
+#: sphinx/themes/basic/defindex.html:28
+msgid "Global Module Index"
+msgstr "গ্লোবাল মডিউল ইনডেক্স"
+
+#: sphinx/themes/basic/defindex.html:29
msgid "quick access to all modules"
msgstr "সকল মডিউলে দ্রুত প্রবেশ"
-#: sphinx/themes/basic/defindex.html:22
+#: sphinx/themes/basic/defindex.html:31
msgid "all functions, classes, terms"
msgstr "সকল ফাংশন, ক্লাস, টার্ম"
-#: sphinx/themes/basic/genindex-single.html:5
+#: sphinx/themes/basic/genindex-single.html:35
#, python-format
msgid "Index &ndash; %(key)s"
msgstr "ইনডেক্স &ndash; %(key)s"
-#: sphinx/themes/basic/genindex-single.html:44
-#: sphinx/themes/basic/genindex-split.html:14
-#: sphinx/themes/basic/genindex-split.html:27
-#: sphinx/themes/basic/genindex.html:54
+#: sphinx/themes/basic/genindex-single.html:63
+#: sphinx/themes/basic/genindex-split.html:24
+#: sphinx/themes/basic/genindex-split.html:38
+#: sphinx/themes/basic/genindex.html:74
msgid "Full index on one page"
msgstr "এক পাতায় সম্পূর্ণ ইনডেক্স"
-#: sphinx/themes/basic/genindex-split.html:7
+#: sphinx/themes/basic/genindex-split.html:16
msgid "Index pages by letter"
msgstr "বর্ণানুসারে ইনডেক্স পাতা"
-#: sphinx/themes/basic/genindex-split.html:15
+#: sphinx/themes/basic/genindex-split.html:25
msgid "can be huge"
msgstr "খুব বড় হতে পারে"
-#: sphinx/themes/basic/layout.html:10
+#: sphinx/themes/basic/layout.html:29
msgid "Navigation"
msgstr "নেভিগেশন"
-#: sphinx/themes/basic/layout.html:42
-msgid "Table Of Contents"
-msgstr "সূচীপত্র"
-
-#: sphinx/themes/basic/layout.html:48
-msgid "Previous topic"
-msgstr "পূর্ববর্তী টপিক"
-
-#: sphinx/themes/basic/layout.html:50
-msgid "previous chapter"
-msgstr "পূর্ববর্তী অধ্যায়"
-
-#: sphinx/themes/basic/layout.html:53
-msgid "Next topic"
-msgstr "পরবর্তী টপিক"
-
-#: sphinx/themes/basic/layout.html:55
-msgid "next chapter"
-msgstr "পরবর্তী অধ্যায়"
-
-#: sphinx/themes/basic/layout.html:60
-msgid "This Page"
-msgstr "এই পাতা"
-
-#: sphinx/themes/basic/layout.html:63
-msgid "Show Source"
-msgstr "সোর্স দেখুন"
-
-#: sphinx/themes/basic/layout.html:73
-msgid "Quick search"
-msgstr "দ্রুত অনুসন্ধান"
-
-#: sphinx/themes/basic/layout.html:76
-msgid "Go"
-msgstr "যান"
-
-#: sphinx/themes/basic/layout.html:81
-msgid "Enter search terms or a module, class or function name."
-msgstr "অনুসন্ধানের জন্য টার্ম, মডিউল, ক্লাস অথবা ফাংশনের নাম দিন।"
-
#: sphinx/themes/basic/layout.html:122
#, python-format
msgid "Search within %(docstitle)s"
@@ -530,51 +617,56 @@ msgstr "%(docstitle)s এর মধ্যে খুঁজুন"
msgid "About these documents"
msgstr "এই ডকুমেন্ট সম্পর্কে"
-#: sphinx/themes/basic/layout.html:137
-#: sphinx/themes/basic/search.html:2
-#: sphinx/themes/basic/search.html:5
-msgid "Search"
-msgstr "অনুসন্ধান"
-
#: sphinx/themes/basic/layout.html:140
msgid "Copyright"
msgstr "কপিরাইট"
-#: sphinx/themes/basic/layout.html:187
-#: sphinx/themes/scrolls/layout.html:83
+#: sphinx/themes/basic/layout.html:189
#, python-format
msgid "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
msgstr "&copy; <a href=\"%(path)s\">কপিরাইট</a> %(copyright)s."
-#: sphinx/themes/basic/layout.html:189
-#: sphinx/themes/scrolls/layout.html:85
+#: sphinx/themes/basic/layout.html:191
#, python-format
msgid "&copy; Copyright %(copyright)s."
msgstr "&copy; কপিরাইট %(copyright)s."
-#: sphinx/themes/basic/layout.html:193
-#: sphinx/themes/scrolls/layout.html:89
+#: sphinx/themes/basic/layout.html:195
#, python-format
msgid "Last updated on %(last_updated)s."
msgstr "%(last_updated)s সর্বশেষ পরিবর্তন করা হয়েছে।"
-#: sphinx/themes/basic/layout.html:196
-#: sphinx/themes/scrolls/layout.html:92
+#: sphinx/themes/basic/layout.html:198
#, python-format
-msgid "Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> %(sphinx_version)s."
-msgstr "<a href=\"http://sphinx.pocoo.org/\">Sphinx</a> %(sphinx_version)s দিয়ে তৈরী।"
-
-#: sphinx/themes/basic/modindex.html:36
-#: sphinx/themes/scrolls/modindex.html:37
-msgid "Deprecated"
-msgstr "ডেপ্রিকেটেড"
+msgid ""
+"Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+"<a href=\"http://sphinx.pocoo.org/\">Sphinx</a> %(sphinx_version)s দিয়ে "
+"তৈরী।"
#: sphinx/themes/basic/opensearch.xml:4
#, python-format
msgid "Search %(docstitle)s"
msgstr "%(docstitle)s-এ খুঁজুন"
-#: sphinx/themes/basic/search.html:9
+#: sphinx/themes/basic/relations.html:11
+msgid "Previous topic"
+msgstr "পূর্ববর্তী টপিক"
+
+#: sphinx/themes/basic/relations.html:13
+msgid "previous chapter"
+msgstr "পূর্ববর্তী অধ্যায়"
+
+#: sphinx/themes/basic/relations.html:16
+msgid "Next topic"
+msgstr "পরবর্তী টপিক"
+
+#: sphinx/themes/basic/relations.html:18
+msgid "next chapter"
+msgstr "পরবর্তী অধ্যায়"
+
+#: sphinx/themes/basic/search.html:24
msgid ""
"Please activate JavaScript to enable the search\n"
" functionality."
@@ -582,7 +674,7 @@ msgstr ""
"অনুসন্ধান করার জন্য অনুগ্রহপূর্বক জাভাস্ক্রিপ্ট \n"
" সক্রিয় করুন।"
-#: sphinx/themes/basic/search.html:14
+#: sphinx/themes/basic/search.html:29
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"
@@ -590,23 +682,32 @@ msgid ""
" containing fewer words won't appear in the result list."
msgstr ""
"এখান থেকে এই নথিগুলোতে আপনি অনুসন্ধান করতে পারবেন। \n"
-" আপনার কাঙ্ক্ষিত শব্দসমূহ নিচের বাক্সে লিখুন এবং \"অনুসন্ধান\" বাটনে ক্লিক করুন।\n"
-" উল্লেখ্য, সকল শব্দসমূহের উপস্থিতি নিয়ে অনুসন্ধান করা হবে। যেসব পাতায় সকল\n"
+" আপনার কাঙ্ক্ষিত শব্দসমূহ নিচের বাক্সে লিখুন এবং \"অনুসন্ধান\" বাটনে "
+"ক্লিক করুন।\n"
+" উল্লেখ্য, সকল শব্দসমূহের উপস্থিতি নিয়ে অনুসন্ধান করা হবে। যেসব পাতায় "
+"সকল\n"
" শব্দ নেই সেগুলো বাদ দেয়া হবে।"
-#: sphinx/themes/basic/search.html:21
+#: sphinx/themes/basic/search.html:36
msgid "search"
msgstr "খুঁজুন"
-#: sphinx/themes/basic/search.html:25
-#: sphinx/themes/basic/static/searchtools.js:473
+#: sphinx/themes/basic/search.html:40
msgid "Search Results"
msgstr "অনুসন্ধানের ফলাফল"
-#: sphinx/themes/basic/search.html:27
+#: sphinx/themes/basic/search.html:42
msgid "Your search did not match any results."
msgstr "আপনার অনুসন্ধানে কোন ফলাফল পাওয়া যায়নি।"
+#: sphinx/themes/basic/searchbox.html:12
+msgid "Quick search"
+msgstr "দ্রুত অনুসন্ধান"
+
+#: sphinx/themes/basic/sourcelink.html:11
+msgid "This Page"
+msgstr "এই পাতা"
+
#: sphinx/themes/basic/changes/frameset.html:5
#: sphinx/themes/basic/changes/versionchanges.html:12
#, python-format
@@ -635,64 +736,50 @@ msgstr "C API পরিবর্তন"
msgid "Other changes"
msgstr "অন্যান্য পরিবর্তন"
-#: sphinx/themes/basic/static/doctools.js:138
-#: sphinx/writers/html.py:462
-#: sphinx/writers/html.py:467
+#: sphinx/themes/basic/static/doctools.js:154 sphinx/writers/html.py:504
+#: sphinx/writers/html.py:510
msgid "Permalink to this headline"
msgstr "এই শিরোনামের পার্মালিঙ্ক"
-#: sphinx/themes/basic/static/doctools.js:144
-#: sphinx/writers/html.py:80
+#: sphinx/themes/basic/static/doctools.js:160 sphinx/writers/html.py:92
msgid "Permalink to this definition"
msgstr "এই সংজ্ঞার পার্মালিঙ্ক"
-#: sphinx/themes/basic/static/doctools.js:173
+#: sphinx/themes/basic/static/doctools.js:189
msgid "Hide Search Matches"
msgstr "অনুসন্ধানের ম্যাচগুলো লুকান"
-#: sphinx/themes/basic/static/searchtools.js:274
-msgid "Searching"
-msgstr "অনুসন্ধান চলছে"
-
-#: sphinx/themes/basic/static/searchtools.js:279
-msgid "Preparing search..."
-msgstr "অনুসন্ধানের প্রস্তুতি চলছে..."
-
-#: sphinx/themes/basic/static/searchtools.js:352
-msgid ", in "
-msgstr ", -"
+#: sphinx/themes/default/static/sidebar.js:69
+msgid "Expand sidebar"
+msgstr ""
-#: sphinx/themes/basic/static/searchtools.js:475
-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/themes/default/static/sidebar.js:82
+#: sphinx/themes/default/static/sidebar.js:110
+msgid "Collapse sidebar"
+msgstr ""
-#: sphinx/themes/basic/static/searchtools.js:477
-#, python-format
-msgid "Search finished, found %s page(s) matching the search query."
-msgstr "অনুসন্ধান শেষ হয়েছে, ফলাফলে %s-টি পাতা পাওয়া গেছে।"
+#: sphinx/themes/haiku/layout.html:26
+msgid "Contents"
+msgstr ""
-#: sphinx/writers/latex.py:187
+#: sphinx/writers/latex.py:177
msgid "Release"
msgstr "রিলিজ"
-#: sphinx/writers/latex.py:579
+#: sphinx/writers/latex.py:594 sphinx/writers/manpage.py:182
+#: sphinx/writers/texinfo.py:589
msgid "Footnotes"
msgstr "পাদটীকা"
-#: sphinx/writers/latex.py:647
+#: sphinx/writers/latex.py:676
msgid "continued from previous page"
msgstr "পূর্ববর্তী পাতা হতে চলমান"
-#: sphinx/writers/latex.py:652
+#: sphinx/writers/latex.py:681
msgid "Continued on next page"
msgstr "পরবর্তী পাতাতে চলমান"
-#: sphinx/writers/text.py:166
-#, python-format
-msgid "Platform: %s"
-msgstr "প্লাটফরম: %s"
-
-#: sphinx/writers/text.py:428
+#: sphinx/writers/text.py:437
msgid "[image]"
msgstr "[ছবি]"
diff --git a/sphinx/locale/ca/LC_MESSAGES/sphinx.js b/sphinx/locale/ca/LC_MESSAGES/sphinx.js
index 71a50776..736d9b76 100644
--- a/sphinx/locale/ca/LC_MESSAGES/sphinx.js
+++ b/sphinx/locale/ca/LC_MESSAGES/sphinx.js
@@ -1 +1 @@
-Documentation.addTranslations({"locale": "ca", "plural_expr": "(n != 1)", "messages": {"Search Results": "Resultats de la Cerca", "Preparing search...": "Preparant la cerca...", "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "La teva cerca no ha donat resultats. Assegura't que totes les paraules estan ben escrites i que has seleccionat prou categories.", "Search finished, found %s page(s) matching the search query.": "Cerca finalitzada, s'han trobat %s p\u00e0gin(a/es) de resultats.", ", in ": ", a ", "Expand sidebar": "", "Permalink to this headline": "Link permanent a aquest t\u00edtol", "Searching": "Cercant", "Collapse sidebar": "", "Permalink to this definition": "Link permanent a aquesta definici\u00f3", "Hide Search Matches": "Oculta Resultats de Cerca"}}); \ No newline at end of file
+Documentation.addTranslations({"locale": "ca", "plural_expr": "(n != 1)", "messages": {"Hide Search Matches": "Oculta Resultats de Cerca", "Permalink to this definition": "Link permanent a aquesta definici\u00f3", "Expand sidebar": "", "Permalink to this headline": "Link permanent a aquest t\u00edtol", "Collapse sidebar": ""}}); \ No newline at end of file
diff --git a/sphinx/locale/ca/LC_MESSAGES/sphinx.mo b/sphinx/locale/ca/LC_MESSAGES/sphinx.mo
index 339c787f..fc373e47 100644
--- a/sphinx/locale/ca/LC_MESSAGES/sphinx.mo
+++ b/sphinx/locale/ca/LC_MESSAGES/sphinx.mo
Binary files differ
diff --git a/sphinx/locale/ca/LC_MESSAGES/sphinx.po b/sphinx/locale/ca/LC_MESSAGES/sphinx.po
index 7bfb6642..c876228e 100644
--- a/sphinx/locale/ca/LC_MESSAGES/sphinx.po
+++ b/sphinx/locale/ca/LC_MESSAGES/sphinx.po
@@ -7,387 +7,405 @@ msgid ""
msgstr ""
"Project-Id-Version: Sphinx 1.0\n"
"Report-Msgid-Bugs-To: pau.fernandez@upc.edu\n"
-"POT-Creation-Date: 2009-05-22 18:51+0200\n"
-"PO-Revision-Date: 2010-05-24 23:54+0200\n"
+"POT-Creation-Date: 2011-09-21 10:06+0200\n"
+"PO-Revision-Date: 2011-01-22 14:41+0100\n"
"Last-Translator: Pau Fernández <pau.fernandez@upc.edu>\n"
"Language-Team: ca <LL@li.org>\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"
+"Generated-By: Babel 0.9.6\n"
-#: sphinx/environment.py:106 sphinx/writers/latex.py:184
-#: sphinx/writers/manpage.py:67
+#: sphinx/config.py:81
+#, fuzzy, python-format
+msgid "%s %s documentation"
+msgstr "%s %s documentació"
+
+#: sphinx/environment.py:119 sphinx/writers/latex.py:190
+#: sphinx/writers/manpage.py:67 sphinx/writers/texinfo.py:203
#, python-format
msgid "%B %d, %Y"
msgstr "%d de %B de %Y"
-#: sphinx/roles.py:174
+#: sphinx/environment.py:1625
+#, python-format
+msgid "see %s"
+msgstr "vegeu %s"
+
+#: sphinx/environment.py:1628
#, python-format
-msgid "Python Enhancement Proposals!PEP %s"
-msgstr "Python Enhancement Proposals!PEP %s"
+msgid "see also %s"
+msgstr "vegeu també %s"
-#: sphinx/builders/changes.py:72
+#: sphinx/roles.py:175
+#, python-format
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr "Python Enhancement Proposals; PEP %s"
+
+#: sphinx/builders/changes.py:73
msgid "Builtins"
msgstr "Mòduls Interns"
-#: sphinx/builders/changes.py:74
+#: sphinx/builders/changes.py:75
msgid "Module level"
msgstr "Nivell de mòdul"
-#: sphinx/builders/html.py:266
+#: sphinx/builders/html.py:274
#, python-format
msgid "%b %d, %Y"
msgstr "%d %b, %Y"
-#: sphinx/builders/html.py:285 sphinx/themes/basic/defindex.html:30
+#: sphinx/builders/html.py:293 sphinx/themes/basic/defindex.html:30
msgid "General Index"
msgstr "Índex General"
-#: sphinx/builders/html.py:285
+#: sphinx/builders/html.py:293
msgid "index"
msgstr "índex"
-#: sphinx/builders/html.py:345
+#: sphinx/builders/html.py:353
msgid "next"
msgstr "següent"
-#: sphinx/builders/html.py:354
+#: sphinx/builders/html.py:362
msgid "previous"
msgstr "anterior"
-#: sphinx/builders/latex.py:151
+#: sphinx/builders/latex.py:141 sphinx/builders/texinfo.py:196
msgid " (in "
msgstr " (a "
-#: sphinx/directives/other.py:127
+#: sphinx/directives/other.py:136
msgid "Section author: "
msgstr "Autor de la secció:"
-#: sphinx/directives/other.py:129
+#: sphinx/directives/other.py:138
msgid "Module author: "
msgstr "Autor del mòdul: "
-#: sphinx/directives/other.py:131
+#: sphinx/directives/other.py:140
#, fuzzy
msgid "Code author: "
msgstr "Autor del mòdul: "
-#: sphinx/directives/other.py:133
+#: sphinx/directives/other.py:142
msgid "Author: "
msgstr "Autor: "
-#: sphinx/directives/other.py:238
+#: sphinx/directives/other.py:215
msgid "See also"
msgstr "Vegeu també"
-#: sphinx/domains/__init__.py:253
+#: sphinx/domains/__init__.py:244
#, python-format
msgid "%s %s"
msgstr ""
-#: sphinx/domains/c.py:51 sphinx/domains/python.py:49
+#: sphinx/domains/c.py:51 sphinx/domains/python.py:95
msgid "Parameters"
msgstr "Paràmetres"
-#: sphinx/domains/c.py:54 sphinx/domains/javascript.py:137
-#: sphinx/domains/python.py:59
+#: sphinx/domains/c.py:54 sphinx/domains/javascript.py:128
+#: sphinx/domains/python.py:107
msgid "Returns"
msgstr "Retorna"
-#: sphinx/domains/c.py:56 sphinx/domains/python.py:61
+#: sphinx/domains/c.py:56 sphinx/domains/python.py:109
msgid "Return type"
msgstr "Tipus de retorn"
-#: sphinx/domains/c.py:133
+#: sphinx/domains/c.py:141
#, python-format
msgid "%s (C function)"
msgstr "%s (funció de C)"
-#: sphinx/domains/c.py:135
+#: sphinx/domains/c.py:143
#, python-format
msgid "%s (C member)"
msgstr "%s (membre de C)"
-#: sphinx/domains/c.py:137
+#: sphinx/domains/c.py:145
#, python-format
msgid "%s (C macro)"
msgstr "%s (macro de C)"
-#: sphinx/domains/c.py:139
+#: sphinx/domains/c.py:147
#, python-format
msgid "%s (C type)"
msgstr "%s (tipus de C)"
-#: sphinx/domains/c.py:141
+#: sphinx/domains/c.py:149
#, python-format
msgid "%s (C variable)"
msgstr "%s (variable de C)"
-#: sphinx/domains/c.py:171 sphinx/domains/cpp.py:1031
-#: sphinx/domains/javascript.py:166 sphinx/domains/python.py:497
+#: sphinx/domains/c.py:204 sphinx/domains/cpp.py:1060
+#: sphinx/domains/javascript.py:162 sphinx/domains/python.py:559
msgid "function"
msgstr "funció"
-#: sphinx/domains/c.py:172 sphinx/domains/cpp.py:1032
+#: sphinx/domains/c.py:205 sphinx/domains/cpp.py:1061
msgid "member"
msgstr "membre"
-#: sphinx/domains/c.py:173
+#: sphinx/domains/c.py:206
msgid "macro"
msgstr "macro"
-#: sphinx/domains/c.py:174 sphinx/domains/cpp.py:1033
+#: sphinx/domains/c.py:207 sphinx/domains/cpp.py:1062
msgid "type"
msgstr "tipus"
-#: sphinx/domains/c.py:175
-#, fuzzy
+#: sphinx/domains/c.py:208
msgid "variable"
-msgstr "Variable"
+msgstr "variable"
-#: sphinx/domains/cpp.py:876
+#: sphinx/domains/cpp.py:904
#, python-format
msgid "%s (C++ class)"
msgstr "%s (class de C++)"
-#: sphinx/domains/cpp.py:891
+#: sphinx/domains/cpp.py:919
#, python-format
msgid "%s (C++ type)"
msgstr "%s (tipus de C++)"
-#: sphinx/domains/cpp.py:910
+#: sphinx/domains/cpp.py:938
#, python-format
msgid "%s (C++ member)"
msgstr "%s (membre de C++)"
-#: sphinx/domains/cpp.py:962
+#: sphinx/domains/cpp.py:990
#, python-format
msgid "%s (C++ function)"
msgstr "%s (funció de C++)"
-#: sphinx/domains/cpp.py:1030 sphinx/domains/python.py:499
+#: sphinx/domains/cpp.py:1059 sphinx/domains/javascript.py:163
+#: sphinx/domains/python.py:561
msgid "class"
msgstr "class"
-#: sphinx/domains/javascript.py:117 sphinx/domains/python.py:221
+#: sphinx/domains/javascript.py:106 sphinx/domains/python.py:254
#, python-format
msgid "%s() (built-in function)"
msgstr "%s() (funció interna)"
-#: sphinx/domains/javascript.py:118 sphinx/domains/python.py:285
+#: sphinx/domains/javascript.py:107 sphinx/domains/python.py:318
#, python-format
msgid "%s() (%s method)"
msgstr "%s() (mètode %s)"
-#: sphinx/domains/javascript.py:120
+#: sphinx/domains/javascript.py:109
+#, python-format
+msgid "%s() (class)"
+msgstr "%s() (class)"
+
+#: sphinx/domains/javascript.py:111
#, python-format
msgid "%s (global variable or constant)"
msgstr ""
-#: sphinx/domains/javascript.py:122 sphinx/domains/python.py:323
+#: sphinx/domains/javascript.py:113 sphinx/domains/python.py:356
#, python-format
msgid "%s (%s attribute)"
msgstr "%s (atribut %s)"
-#: sphinx/domains/javascript.py:131
+#: sphinx/domains/javascript.py:122
#, fuzzy
msgid "Arguments"
msgstr "Paràmetres"
-#: sphinx/domains/javascript.py:134
+#: sphinx/domains/javascript.py:125
msgid "Throws"
msgstr ""
-#: sphinx/domains/javascript.py:167 sphinx/domains/python.py:498
+#: sphinx/domains/javascript.py:164 sphinx/domains/python.py:560
msgid "data"
msgstr ""
-#: sphinx/domains/javascript.py:168 sphinx/domains/python.py:504
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:566
msgid "attribute"
msgstr "atribut"
-#: sphinx/domains/python.py:53
+#: sphinx/domains/python.py:100
#, fuzzy
msgid "Variables"
msgstr "Variable"
-#: sphinx/domains/python.py:56
+#: sphinx/domains/python.py:104
msgid "Raises"
msgstr "Llença"
-#: sphinx/domains/python.py:222 sphinx/domains/python.py:279
-#: sphinx/domains/python.py:291 sphinx/domains/python.py:304
+#: sphinx/domains/python.py:255 sphinx/domains/python.py:312
+#: sphinx/domains/python.py:324 sphinx/domains/python.py:337
#, python-format
msgid "%s() (in module %s)"
msgstr "%s() (al mòdul %s)"
-#: sphinx/domains/python.py:225
+#: sphinx/domains/python.py:258
#, python-format
msgid "%s (built-in variable)"
msgstr "%s (variable interna)"
-#: sphinx/domains/python.py:226 sphinx/domains/python.py:317
+#: sphinx/domains/python.py:259 sphinx/domains/python.py:350
#, python-format
msgid "%s (in module %s)"
msgstr "%s (al mòdul %s)"
-#: sphinx/domains/python.py:242
+#: sphinx/domains/python.py:275
#, python-format
msgid "%s (built-in class)"
msgstr "%s (classe interna)"
-#: sphinx/domains/python.py:243
+#: sphinx/domains/python.py:276
#, python-format
msgid "%s (class in %s)"
msgstr "%s (class a %s)"
-#: sphinx/domains/python.py:283
+#: sphinx/domains/python.py:316
#, python-format
msgid "%s() (%s.%s method)"
msgstr "%s() (mètode %s.%s)"
-#: sphinx/domains/python.py:295
+#: sphinx/domains/python.py:328
#, python-format
msgid "%s() (%s.%s static method)"
msgstr "%s() (mètode estàtic %s.%s)"
-#: sphinx/domains/python.py:298
+#: sphinx/domains/python.py:331
#, python-format
msgid "%s() (%s static method)"
msgstr "%s() (mètode estàtic %s)"
-#: sphinx/domains/python.py:308
+#: sphinx/domains/python.py:341
#, fuzzy, python-format
msgid "%s() (%s.%s class method)"
msgstr "%s() (mètode %s.%s)"
-#: sphinx/domains/python.py:311
+#: sphinx/domains/python.py:344
#, fuzzy, python-format
msgid "%s() (%s class method)"
msgstr "%s() (mètode %s)"
-#: sphinx/domains/python.py:321
+#: sphinx/domains/python.py:354
#, python-format
msgid "%s (%s.%s attribute)"
msgstr "%s (atribut %s.%s)"
-#: sphinx/domains/python.py:366
-msgid "Platforms: "
-msgstr "Plataformes: "
-
-#: sphinx/domains/python.py:372
+#: sphinx/domains/python.py:434
#, python-format
msgid "%s (module)"
msgstr "%s (mòdul)"
-#: sphinx/domains/python.py:429
+#: sphinx/domains/python.py:491
#, fuzzy
msgid "Python Module Index"
msgstr "Índex de Mòduls"
-#: sphinx/domains/python.py:430
+#: sphinx/domains/python.py:492
msgid "modules"
msgstr "mòduls"
-#: sphinx/domains/python.py:475
+#: sphinx/domains/python.py:537
msgid "Deprecated"
msgstr "Obsolet"
-#: sphinx/domains/python.py:500 sphinx/locale/__init__.py:162
+#: sphinx/domains/python.py:562 sphinx/locale/__init__.py:179
msgid "exception"
msgstr "excepció"
-#: sphinx/domains/python.py:501
+#: sphinx/domains/python.py:563
msgid "method"
msgstr ""
-#: sphinx/domains/python.py:502
-#, fuzzy, python-format
+#: sphinx/domains/python.py:564
msgid "class method"
-msgstr "%s() (mètode %s)"
+msgstr ""
-#: sphinx/domains/python.py:503
+#: sphinx/domains/python.py:565
msgid "static method"
msgstr "mètode estàtic"
-#: sphinx/domains/python.py:505 sphinx/locale/__init__.py:158
+#: sphinx/domains/python.py:567 sphinx/locale/__init__.py:175
msgid "module"
msgstr "mòdul"
-#: sphinx/domains/rst.py:53
+#: sphinx/domains/python.py:695
+msgid " (deprecated)"
+msgstr " (obsolet)"
+
+#: sphinx/domains/rst.py:55
#, python-format
msgid "%s (directive)"
msgstr ""
-#: sphinx/domains/rst.py:55
-#, fuzzy, python-format
+#: sphinx/domains/rst.py:57
+#, python-format
msgid "%s (role)"
-msgstr "%s (mòdul)"
+msgstr ""
-#: sphinx/domains/rst.py:103
+#: sphinx/domains/rst.py:106
msgid "directive"
msgstr ""
-#: sphinx/domains/rst.py:104
-#, fuzzy
+#: sphinx/domains/rst.py:107
msgid "role"
-msgstr "mòdul"
+msgstr ""
-#: sphinx/domains/std.py:68 sphinx/domains/std.py:84
+#: sphinx/domains/std.py:70 sphinx/domains/std.py:86
#, python-format
msgid "environment variable; %s"
msgstr "variable d'entorn; %s"
-#: sphinx/domains/std.py:160
+#: sphinx/domains/std.py:162
#, python-format
msgid "%scommand line option; %s"
msgstr "opció de línia de comandes %s; %s"
-#: sphinx/domains/std.py:328
+#: sphinx/domains/std.py:393
msgid "glossary term"
msgstr ""
-#: sphinx/domains/std.py:329
+#: sphinx/domains/std.py:394
msgid "grammar token"
msgstr ""
-#: sphinx/domains/std.py:330
+#: sphinx/domains/std.py:395
msgid "reference label"
msgstr ""
-#: sphinx/domains/std.py:331
+#: sphinx/domains/std.py:396
msgid "environment variable"
msgstr "variable d'entorn"
-#: sphinx/domains/std.py:332
+#: sphinx/domains/std.py:397
msgid "program option"
msgstr ""
-#: sphinx/domains/std.py:360 sphinx/themes/basic/genindex-single.html:11
+#: sphinx/domains/std.py:427 sphinx/themes/basic/genindex-single.html:32
#: sphinx/themes/basic/genindex-split.html:11
#: sphinx/themes/basic/genindex-split.html:14
-#: sphinx/themes/basic/genindex.html:11 sphinx/themes/basic/genindex.html:14
-#: sphinx/themes/basic/genindex.html:50 sphinx/themes/basic/layout.html:125
-#: sphinx/writers/latex.py:173
+#: sphinx/themes/basic/genindex.html:32 sphinx/themes/basic/genindex.html:35
+#: sphinx/themes/basic/genindex.html:68 sphinx/themes/basic/layout.html:134
+#: sphinx/writers/latex.py:179 sphinx/writers/texinfo.py:456
msgid "Index"
msgstr "Índex"
-#: sphinx/domains/std.py:361
+#: sphinx/domains/std.py:428
msgid "Module Index"
msgstr "Índex de Mòduls"
-#: sphinx/domains/std.py:362 sphinx/themes/basic/defindex.html:25
+#: sphinx/domains/std.py:429 sphinx/themes/basic/defindex.html:25
msgid "Search Page"
msgstr "Pàgina de Cerca"
-#: sphinx/ext/autodoc.py:917
+#: sphinx/ext/autodoc.py:1002
#, python-format
msgid " Bases: %s"
msgstr " Bases: %s"
-#: sphinx/ext/autodoc.py:950
+#: sphinx/ext/autodoc.py:1038
#, python-format
msgid "alias of :class:`%s`"
msgstr "àlies de :class:`%s`"
@@ -405,104 +423,104 @@ msgstr "(La <<entrada original>> està a %s, línia %d i.)"
msgid "original entry"
msgstr ""
-#: sphinx/ext/viewcode.py:66
+#: sphinx/ext/viewcode.py:70
msgid "[source]"
msgstr ""
-#: sphinx/ext/viewcode.py:109
+#: sphinx/ext/viewcode.py:117
msgid "[docs]"
msgstr ""
-#: sphinx/ext/viewcode.py:123
+#: sphinx/ext/viewcode.py:131
#, fuzzy
msgid "Module code"
msgstr "mòdul"
-#: sphinx/ext/viewcode.py:129
+#: sphinx/ext/viewcode.py:137
#, python-format
msgid "<h1>Source code for %s</h1>"
msgstr ""
-#: sphinx/ext/viewcode.py:156
+#: sphinx/ext/viewcode.py:164
msgid "Overview: module code"
msgstr ""
-#: sphinx/ext/viewcode.py:157
+#: sphinx/ext/viewcode.py:165
msgid "<h1>All modules for which code is available</h1>"
msgstr ""
-#: sphinx/locale/__init__.py:139
+#: sphinx/locale/__init__.py:155
msgid "Attention"
msgstr "Atenció"
-#: sphinx/locale/__init__.py:140
+#: sphinx/locale/__init__.py:156
msgid "Caution"
msgstr "Compte"
-#: sphinx/locale/__init__.py:141
+#: sphinx/locale/__init__.py:157
msgid "Danger"
msgstr "Perill"
-#: sphinx/locale/__init__.py:142
+#: sphinx/locale/__init__.py:158
msgid "Error"
msgstr "Error"
-#: sphinx/locale/__init__.py:143
+#: sphinx/locale/__init__.py:159
msgid "Hint"
msgstr "Suggerència"
-#: sphinx/locale/__init__.py:144
+#: sphinx/locale/__init__.py:160
msgid "Important"
msgstr "Important"
-#: sphinx/locale/__init__.py:145
+#: sphinx/locale/__init__.py:161
msgid "Note"
msgstr "Nota"
-#: sphinx/locale/__init__.py:146
+#: sphinx/locale/__init__.py:162
msgid "See Also"
msgstr "Vegeu També"
-#: sphinx/locale/__init__.py:147
+#: sphinx/locale/__init__.py:163
msgid "Tip"
msgstr "Truc"
-#: sphinx/locale/__init__.py:148
+#: sphinx/locale/__init__.py:164
msgid "Warning"
msgstr "Avís"
-#: sphinx/locale/__init__.py:152
+#: sphinx/locale/__init__.py:168
#, python-format
msgid "New in version %s"
msgstr "Novetat de la versió %s"
-#: sphinx/locale/__init__.py:153
+#: sphinx/locale/__init__.py:169
#, python-format
msgid "Changed in version %s"
msgstr "Canviat a la versió %s"
-#: sphinx/locale/__init__.py:154
+#: sphinx/locale/__init__.py:170
#, python-format
msgid "Deprecated since version %s"
msgstr "Obsolet desde la versió %s"
-#: sphinx/locale/__init__.py:159
+#: sphinx/locale/__init__.py:176
msgid "keyword"
msgstr "paraula clau"
-#: sphinx/locale/__init__.py:160
+#: sphinx/locale/__init__.py:177
msgid "operator"
msgstr "operador"
-#: sphinx/locale/__init__.py:161
+#: sphinx/locale/__init__.py:178
msgid "object"
msgstr "objecte"
-#: sphinx/locale/__init__.py:163
+#: sphinx/locale/__init__.py:180
msgid "statement"
msgstr "sentència"
-#: sphinx/locale/__init__.py:164
+#: sphinx/locale/__init__.py:181
msgid "built-in function"
msgstr "funció interna"
@@ -511,8 +529,8 @@ msgstr "funció interna"
msgid "Table Of Contents"
msgstr "Taula de Contingut"
-#: sphinx/themes/agogo/layout.html:49 sphinx/themes/basic/layout.html:128
-#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:14
+#: sphinx/themes/agogo/layout.html:49 sphinx/themes/basic/layout.html:137
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:20
msgid "Search"
msgstr "Cerca"
@@ -560,15 +578,15 @@ msgstr "accés ràpid a tots els mòduls"
msgid "all functions, classes, terms"
msgstr "totes les funcions, classes, termes"
-#: sphinx/themes/basic/genindex-single.html:14
+#: sphinx/themes/basic/genindex-single.html:35
#, python-format
msgid "Index &ndash; %(key)s"
msgstr "Índes &ndash; %(key)s"
-#: sphinx/themes/basic/genindex-single.html:46
+#: sphinx/themes/basic/genindex-single.html:63
#: sphinx/themes/basic/genindex-split.html:24
#: sphinx/themes/basic/genindex-split.html:38
-#: sphinx/themes/basic/genindex.html:56
+#: sphinx/themes/basic/genindex.html:74
msgid "Full index on one page"
msgstr "Índex complet en una pàgina"
@@ -580,39 +598,39 @@ msgstr "Pàgines d'índex per lletra"
msgid "can be huge"
msgstr "pot ser gegant"
-#: sphinx/themes/basic/layout.html:23
+#: sphinx/themes/basic/layout.html:29
msgid "Navigation"
msgstr "Navegació"
-#: sphinx/themes/basic/layout.html:113
+#: sphinx/themes/basic/layout.html:122
#, python-format
msgid "Search within %(docstitle)s"
msgstr "Cerca dins de %(docstitle)s"
-#: sphinx/themes/basic/layout.html:122
+#: sphinx/themes/basic/layout.html:131
msgid "About these documents"
msgstr "Quant a aquests documents"
-#: sphinx/themes/basic/layout.html:131
+#: sphinx/themes/basic/layout.html:140
msgid "Copyright"
msgstr "Copyright"
-#: sphinx/themes/basic/layout.html:180
+#: sphinx/themes/basic/layout.html:189
#, python-format
msgid "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
msgstr "&copy; <a href=\\\"%(path)s\\\">Copyright</a> %(copyright)s."
-#: sphinx/themes/basic/layout.html:182
+#: sphinx/themes/basic/layout.html:191
#, python-format
msgid "&copy; Copyright %(copyright)s."
msgstr "&copy; Copyright %(copyright)s."
-#: sphinx/themes/basic/layout.html:186
+#: sphinx/themes/basic/layout.html:195
#, python-format
msgid "Last updated on %(last_updated)s."
msgstr "Última actualització el %(last_updated)s."
-#: sphinx/themes/basic/layout.html:189
+#: sphinx/themes/basic/layout.html:198
#, python-format
msgid ""
"Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
@@ -642,7 +660,7 @@ msgstr "Tema següent"
msgid "next chapter"
msgstr "capítol següent"
-#: sphinx/themes/basic/search.html:18
+#: sphinx/themes/basic/search.html:24
msgid ""
"Please activate JavaScript to enable the search\n"
" functionality."
@@ -650,7 +668,7 @@ msgstr ""
"Activa JavaScript per utilitzar la funcionalitat\n"
"de cerca."
-#: sphinx/themes/basic/search.html:23
+#: sphinx/themes/basic/search.html:29
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"
@@ -662,16 +680,15 @@ msgstr ""
"que la cerca inclourà totes les paraules que posis. Les pàgines que no\n"
"tenen totes les paraules no sortiràn."
-#: sphinx/themes/basic/search.html:30
+#: sphinx/themes/basic/search.html:36
msgid "search"
msgstr "cerca"
-#: sphinx/themes/basic/search.html:34
-#: sphinx/themes/basic/static/searchtools.js:489
+#: sphinx/themes/basic/search.html:40
msgid "Search Results"
msgstr "Resultats de la Cerca"
-#: sphinx/themes/basic/search.html:36
+#: sphinx/themes/basic/search.html:42
msgid "Your search did not match any results."
msgstr "La teva cerca no té resultats."
@@ -711,12 +728,12 @@ msgstr "Canvis a la API de C"
msgid "Other changes"
msgstr "Altres canvis"
-#: sphinx/themes/basic/static/doctools.js:154 sphinx/writers/html.py:482
-#: sphinx/writers/html.py:487
+#: sphinx/themes/basic/static/doctools.js:154 sphinx/writers/html.py:504
+#: sphinx/writers/html.py:510
msgid "Permalink to this headline"
msgstr "Link permanent a aquest títol"
-#: sphinx/themes/basic/static/doctools.js:160 sphinx/writers/html.py:87
+#: sphinx/themes/basic/static/doctools.js:160 sphinx/writers/html.py:92
msgid "Permalink to this definition"
msgstr "Link permanent a aquesta definició"
@@ -724,37 +741,12 @@ msgstr "Link permanent a aquesta definició"
msgid "Hide Search Matches"
msgstr "Oculta Resultats de Cerca"
-#: sphinx/themes/basic/static/searchtools.js:285
-msgid "Searching"
-msgstr "Cercant"
-
-#: sphinx/themes/basic/static/searchtools.js:290
-msgid "Preparing search..."
-msgstr "Preparant la cerca..."
-
-#: sphinx/themes/basic/static/searchtools.js:364
-msgid ", in "
-msgstr ", a "
-
-#: sphinx/themes/basic/static/searchtools.js:491
-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 ""
-"La teva cerca no ha donat resultats. Assegura't que totes les paraules "
-"estan ben escrites i que has seleccionat prou categories."
-
-#: sphinx/themes/basic/static/searchtools.js:493
-#, python-format
-msgid "Search finished, found %s page(s) matching the search query."
-msgstr "Cerca finalitzada, s'han trobat %s pàgin(a/es) de resultats."
-
-#: sphinx/themes/default/static/sidebar.js:66
+#: sphinx/themes/default/static/sidebar.js:69
msgid "Expand sidebar"
msgstr ""
-#: sphinx/themes/default/static/sidebar.js:79
-#: sphinx/themes/default/static/sidebar.js:106
+#: sphinx/themes/default/static/sidebar.js:82
+#: sphinx/themes/default/static/sidebar.js:110
msgid "Collapse sidebar"
msgstr ""
@@ -762,22 +754,24 @@ msgstr ""
msgid "Contents"
msgstr ""
-#: sphinx/writers/latex.py:171
+#: sphinx/writers/latex.py:177
msgid "Release"
msgstr "Versió"
-#: sphinx/writers/latex.py:572 sphinx/writers/manpage.py:178
+#: sphinx/writers/latex.py:594 sphinx/writers/manpage.py:182
+#: sphinx/writers/texinfo.py:589
msgid "Footnotes"
msgstr ""
-#: sphinx/writers/latex.py:641
+#: sphinx/writers/latex.py:676
msgid "continued from previous page"
msgstr "ve de la pàgina anterior"
-#: sphinx/writers/latex.py:646
+#: sphinx/writers/latex.py:681
msgid "Continued on next page"
msgstr "Continua a la pàgina següent"
-#: sphinx/writers/text.py:422
+#: sphinx/writers/text.py:437
msgid "[image]"
msgstr "[imatge]"
+
diff --git a/sphinx/locale/cs/LC_MESSAGES/sphinx.js b/sphinx/locale/cs/LC_MESSAGES/sphinx.js
index 8fdd489a..011ef542 100644
--- a/sphinx/locale/cs/LC_MESSAGES/sphinx.js
+++ b/sphinx/locale/cs/LC_MESSAGES/sphinx.js
@@ -1 +1 @@
-Documentation.addTranslations({"locale": "cs", "plural_expr": "(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)", "messages": {"Search Results": "V\u00fdsledky hled\u00e1n\u00ed", "Preparing search...": "P\u0159ipravuji vyhled\u00e1v\u00e1n\u00ed....", "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "Nenalezli jsme \u017e\u00e1dn\u00fd dokument. Ujist\u011bte se pros\u00edm, \u017ee v\u0161echna slova jsou spr\u00e1vn\u011b a \u017ee jste vybral dostatek kategori\u00ed.", "Search finished, found %s page(s) matching the search query.": "Vyhled\u00e1v\u00e1n\u00ed skon\u010dilo, nalezeno %s stran.", ", in ": ", v", "Expand sidebar": "", "Permalink to this headline": "Trval\u00fd odkaz na tento nadpis", "Searching": "Hled\u00e1m", "Collapse sidebar": "", "Permalink to this definition": "Trval\u00fd odkaz na tuto definici", "Hide Search Matches": "Skr\u00fdt v\u00fdsledky vyhled\u00e1v\u00e1n\u00ed"}}); \ No newline at end of file
+Documentation.addTranslations({"locale": "cs", "plural_expr": "(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)", "messages": {"Hide Search Matches": "Skr\u00fdt v\u00fdsledky vyhled\u00e1v\u00e1n\u00ed", "Permalink to this definition": "Trval\u00fd odkaz na tuto definici", "Expand sidebar": "", "Permalink to this headline": "Trval\u00fd odkaz na tento nadpis", "Collapse sidebar": ""}}); \ No newline at end of file
diff --git a/sphinx/locale/cs/LC_MESSAGES/sphinx.mo b/sphinx/locale/cs/LC_MESSAGES/sphinx.mo
index 8092a992..ba0798db 100644
--- a/sphinx/locale/cs/LC_MESSAGES/sphinx.mo
+++ b/sphinx/locale/cs/LC_MESSAGES/sphinx.mo
Binary files differ
diff --git a/sphinx/locale/cs/LC_MESSAGES/sphinx.po b/sphinx/locale/cs/LC_MESSAGES/sphinx.po
index 535d4b9f..9ed728ed 100644
--- a/sphinx/locale/cs/LC_MESSAGES/sphinx.po
+++ b/sphinx/locale/cs/LC_MESSAGES/sphinx.po
@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Sphinx 0.5\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2008-11-27 18:39+0100\n"
-"PO-Revision-Date: 2010-05-24 23:54+0200\n"
+"POT-Creation-Date: 2011-09-21 10:06+0200\n"
+"PO-Revision-Date: 2011-01-22 14:41+0100\n"
"Last-Translator: Pavel Kosina <pavel.kosina@gmail.com>\n"
"Language-Team: Pavel Kosina <pavel.kosina@gmail.com>\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
@@ -16,379 +16,398 @@ msgstr ""
"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"
+"Generated-By: Babel 0.9.6\n"
-#: sphinx/environment.py:106 sphinx/writers/latex.py:184
-#: sphinx/writers/manpage.py:67
+#: sphinx/config.py:81
+#, fuzzy, python-format
+msgid "%s %s documentation"
+msgstr "%s %s dokumentaci"
+
+#: sphinx/environment.py:119 sphinx/writers/latex.py:190
+#: sphinx/writers/manpage.py:67 sphinx/writers/texinfo.py:203
#, python-format
msgid "%B %d, %Y"
msgstr "%d.%m.%Y"
-#: sphinx/roles.py:174
+#: sphinx/environment.py:1625
+#, fuzzy, python-format
+msgid "see %s"
+msgstr "viz %s"
+
+#: sphinx/environment.py:1628
+#, fuzzy, python-format
+msgid "see also %s"
+msgstr "viz také %s"
+
+#: sphinx/roles.py:175
#, python-format
-msgid "Python Enhancement Proposals!PEP %s"
-msgstr "Python Enhancement Proposals!PEP %s"
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr "Python Enhancement Proposals; PEP %s"
-#: sphinx/builders/changes.py:72
+#: sphinx/builders/changes.py:73
msgid "Builtins"
-msgstr "Vestavěné funkce "
+msgstr "Vestavěné funkce"
-#: sphinx/builders/changes.py:74
+#: sphinx/builders/changes.py:75
msgid "Module level"
msgstr "Úroveň modulů"
-#: sphinx/builders/html.py:266
+#: sphinx/builders/html.py:274
#, python-format
msgid "%b %d, %Y"
msgstr "%d.%m.%Y"
-#: sphinx/builders/html.py:285 sphinx/themes/basic/defindex.html:30
+#: sphinx/builders/html.py:293 sphinx/themes/basic/defindex.html:30
msgid "General Index"
msgstr "Rejstřík indexů"
-#: sphinx/builders/html.py:285
+#: sphinx/builders/html.py:293
msgid "index"
msgstr "index"
-#: sphinx/builders/html.py:345
+#: sphinx/builders/html.py:353
msgid "next"
msgstr "další"
-#: sphinx/builders/html.py:354
+#: sphinx/builders/html.py:362
msgid "previous"
msgstr "předchozí"
-#: sphinx/builders/latex.py:151
+#: sphinx/builders/latex.py:141 sphinx/builders/texinfo.py:196
msgid " (in "
msgstr "(v"
-#: sphinx/directives/other.py:127
+#: sphinx/directives/other.py:136
msgid "Section author: "
msgstr "Autor sekce: "
-#: sphinx/directives/other.py:129
+#: sphinx/directives/other.py:138
msgid "Module author: "
msgstr "Autor modulu: "
-#: sphinx/directives/other.py:131
+#: sphinx/directives/other.py:140
#, fuzzy
msgid "Code author: "
msgstr "Autor modulu: "
-#: sphinx/directives/other.py:133
+#: sphinx/directives/other.py:142
msgid "Author: "
msgstr "Autor: "
-#: sphinx/directives/other.py:238
+#: sphinx/directives/other.py:215
msgid "See also"
msgstr "Viz také"
-#: sphinx/domains/__init__.py:253
+#: sphinx/domains/__init__.py:244
#, python-format
msgid "%s %s"
msgstr ""
-#: sphinx/domains/c.py:51 sphinx/domains/python.py:49
+#: sphinx/domains/c.py:51 sphinx/domains/python.py:95
msgid "Parameters"
msgstr "Parametry"
-#: sphinx/domains/c.py:54 sphinx/domains/javascript.py:137
-#: sphinx/domains/python.py:59
+#: sphinx/domains/c.py:54 sphinx/domains/javascript.py:128
+#: sphinx/domains/python.py:107
msgid "Returns"
msgstr "Vrací"
-#: sphinx/domains/c.py:56 sphinx/domains/python.py:61
+#: sphinx/domains/c.py:56 sphinx/domains/python.py:109
msgid "Return type"
msgstr "Typ navrácené hodnoty"
-#: sphinx/domains/c.py:133
+#: sphinx/domains/c.py:141
#, python-format
msgid "%s (C function)"
msgstr "%s (C funkce)"
-#: sphinx/domains/c.py:135
+#: sphinx/domains/c.py:143
#, python-format
msgid "%s (C member)"
msgstr "%s (člen C)"
-#: sphinx/domains/c.py:137
+#: sphinx/domains/c.py:145
#, python-format
msgid "%s (C macro)"
msgstr "%s (C makro)"
-#: sphinx/domains/c.py:139
+#: sphinx/domains/c.py:147
#, python-format
msgid "%s (C type)"
msgstr "%s (C typ)"
-#: sphinx/domains/c.py:141
+#: sphinx/domains/c.py:149
#, python-format
msgid "%s (C variable)"
msgstr "%s (C proměnná)"
-#: sphinx/domains/c.py:171 sphinx/domains/cpp.py:1031
-#: sphinx/domains/javascript.py:166 sphinx/domains/python.py:497
+#: sphinx/domains/c.py:204 sphinx/domains/cpp.py:1060
+#: sphinx/domains/javascript.py:162 sphinx/domains/python.py:559
msgid "function"
msgstr "funkce"
-#: sphinx/domains/c.py:172 sphinx/domains/cpp.py:1032
+#: sphinx/domains/c.py:205 sphinx/domains/cpp.py:1061
msgid "member"
msgstr "člen"
-#: sphinx/domains/c.py:173
+#: sphinx/domains/c.py:206
msgid "macro"
msgstr ""
-#: sphinx/domains/c.py:174 sphinx/domains/cpp.py:1033
+#: sphinx/domains/c.py:207 sphinx/domains/cpp.py:1062
msgid "type"
msgstr "typ"
-#: sphinx/domains/c.py:175
+#: sphinx/domains/c.py:208
#, fuzzy
msgid "variable"
msgstr "Proměnná"
-#: sphinx/domains/cpp.py:876
+#: sphinx/domains/cpp.py:904
#, python-format
msgid "%s (C++ class)"
msgstr "%s (C++ třída)"
-#: sphinx/domains/cpp.py:891
+#: sphinx/domains/cpp.py:919
#, python-format
msgid "%s (C++ type)"
msgstr "%s (C++ typ)"
-#: sphinx/domains/cpp.py:910
+#: sphinx/domains/cpp.py:938
#, python-format
msgid "%s (C++ member)"
msgstr "%s (člen C++)"
-#: sphinx/domains/cpp.py:962
+#: sphinx/domains/cpp.py:990
#, python-format
msgid "%s (C++ function)"
msgstr "%s (C++ funkce)"
-#: sphinx/domains/cpp.py:1030 sphinx/domains/python.py:499
+#: sphinx/domains/cpp.py:1059 sphinx/domains/javascript.py:163
+#: sphinx/domains/python.py:561
msgid "class"
msgstr "třída"
-#: sphinx/domains/javascript.py:117 sphinx/domains/python.py:221
+#: sphinx/domains/javascript.py:106 sphinx/domains/python.py:254
#, python-format
msgid "%s() (built-in function)"
msgstr "%s() (vestavěná funkce)"
-#: sphinx/domains/javascript.py:118 sphinx/domains/python.py:285
+#: sphinx/domains/javascript.py:107 sphinx/domains/python.py:318
#, python-format
msgid "%s() (%s method)"
msgstr "%s() (metoda %s)"
-#: sphinx/domains/javascript.py:120
+#: sphinx/domains/javascript.py:109
+#, python-format
+msgid "%s() (class)"
+msgstr "%s() (třída)"
+
+#: sphinx/domains/javascript.py:111
#, python-format
msgid "%s (global variable or constant)"
msgstr ""
-#: sphinx/domains/javascript.py:122 sphinx/domains/python.py:323
+#: sphinx/domains/javascript.py:113 sphinx/domains/python.py:356
#, python-format
msgid "%s (%s attribute)"
msgstr "%s() (atribut %s)"
-#: sphinx/domains/javascript.py:131
+#: sphinx/domains/javascript.py:122
#, fuzzy
msgid "Arguments"
msgstr "Parametry"
-#: sphinx/domains/javascript.py:134
+#: sphinx/domains/javascript.py:125
msgid "Throws"
msgstr ""
-#: sphinx/domains/javascript.py:167 sphinx/domains/python.py:498
+#: sphinx/domains/javascript.py:164 sphinx/domains/python.py:560
msgid "data"
msgstr ""
-#: sphinx/domains/javascript.py:168 sphinx/domains/python.py:504
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:566
msgid "attribute"
msgstr "atribut"
-#: sphinx/domains/python.py:53
+#: sphinx/domains/python.py:100
#, fuzzy
msgid "Variables"
msgstr "Proměnná"
-#: sphinx/domains/python.py:56
+#: sphinx/domains/python.py:104
msgid "Raises"
msgstr "Vyvolá"
-#: sphinx/domains/python.py:222 sphinx/domains/python.py:279
-#: sphinx/domains/python.py:291 sphinx/domains/python.py:304
+#: sphinx/domains/python.py:255 sphinx/domains/python.py:312
+#: sphinx/domains/python.py:324 sphinx/domains/python.py:337
#, python-format
msgid "%s() (in module %s)"
msgstr "%s() (v modulu %s)"
-#: sphinx/domains/python.py:225
+#: sphinx/domains/python.py:258
#, python-format
msgid "%s (built-in variable)"
msgstr "%s() (vestavěná proměnná)"
-#: sphinx/domains/python.py:226 sphinx/domains/python.py:317
+#: sphinx/domains/python.py:259 sphinx/domains/python.py:350
#, python-format
msgid "%s (in module %s)"
msgstr "%s() (v modulu %s)"
-#: sphinx/domains/python.py:242
+#: sphinx/domains/python.py:275
#, python-format
msgid "%s (built-in class)"
msgstr "%s () (vestavěná proměnná)"
-#: sphinx/domains/python.py:243
+#: sphinx/domains/python.py:276
#, python-format
msgid "%s (class in %s)"
msgstr "%s() (třída v %s)"
-#: sphinx/domains/python.py:283
+#: sphinx/domains/python.py:316
#, python-format
msgid "%s() (%s.%s method)"
msgstr "%s() (metoda %s.%s)"
-#: sphinx/domains/python.py:295
+#: sphinx/domains/python.py:328
#, python-format
msgid "%s() (%s.%s static method)"
msgstr "%s() (statická metoda %s.%s)"
-#: sphinx/domains/python.py:298
+#: sphinx/domains/python.py:331
#, python-format
msgid "%s() (%s static method)"
msgstr "%s() (statická metoda %s)"
-#: sphinx/domains/python.py:308
+#: sphinx/domains/python.py:341
#, fuzzy, python-format
msgid "%s() (%s.%s class method)"
msgstr "%s() (metoda %s.%s)"
-#: sphinx/domains/python.py:311
+#: sphinx/domains/python.py:344
#, fuzzy, python-format
msgid "%s() (%s class method)"
msgstr "%s() (metoda %s)"
-#: sphinx/domains/python.py:321
+#: sphinx/domains/python.py:354
#, python-format
msgid "%s (%s.%s attribute)"
msgstr "%s() (atribut %s.%s)"
-#: sphinx/domains/python.py:366
-msgid "Platforms: "
-msgstr "Platformy: "
-
-#: sphinx/domains/python.py:372
+#: sphinx/domains/python.py:434
#, python-format
msgid "%s (module)"
msgstr "%s (module)"
-#: sphinx/domains/python.py:429
+#: sphinx/domains/python.py:491
#, fuzzy
msgid "Python Module Index"
-msgstr "Rejstřík modulů "
+msgstr "Rejstřík modulů"
-#: sphinx/domains/python.py:430
+#: sphinx/domains/python.py:492
msgid "modules"
msgstr "moduly"
-#: sphinx/domains/python.py:475
+#: sphinx/domains/python.py:537
msgid "Deprecated"
msgstr "Zastaralé"
-#: sphinx/domains/python.py:500 sphinx/locale/__init__.py:162
+#: sphinx/domains/python.py:562 sphinx/locale/__init__.py:179
msgid "exception"
msgstr "výjimka"
-#: sphinx/domains/python.py:501
+#: sphinx/domains/python.py:563
msgid "method"
msgstr ""
-#: sphinx/domains/python.py:502
-#, fuzzy, python-format
+#: sphinx/domains/python.py:564
msgid "class method"
-msgstr "%s() (metoda %s)"
+msgstr ""
-#: sphinx/domains/python.py:503
+#: sphinx/domains/python.py:565
msgid "static method"
msgstr "statická metoda"
-#: sphinx/domains/python.py:505 sphinx/locale/__init__.py:158
+#: sphinx/domains/python.py:567 sphinx/locale/__init__.py:175
msgid "module"
msgstr "modul"
-#: sphinx/domains/rst.py:53
+#: sphinx/domains/python.py:695
+msgid " (deprecated)"
+msgstr " (zastaralé)"
+
+#: sphinx/domains/rst.py:55
#, python-format
msgid "%s (directive)"
msgstr ""
-#: sphinx/domains/rst.py:55
-#, fuzzy, python-format
+#: sphinx/domains/rst.py:57
+#, python-format
msgid "%s (role)"
-msgstr "%s (module)"
+msgstr ""
-#: sphinx/domains/rst.py:103
+#: sphinx/domains/rst.py:106
msgid "directive"
msgstr ""
-#: sphinx/domains/rst.py:104
-#, fuzzy
+#: sphinx/domains/rst.py:107
msgid "role"
-msgstr "modul"
+msgstr ""
-#: sphinx/domains/std.py:68 sphinx/domains/std.py:84
+#: sphinx/domains/std.py:70 sphinx/domains/std.py:86
#, python-format
msgid "environment variable; %s"
msgstr "promměná prostředí, %s"
-#: sphinx/domains/std.py:160
+#: sphinx/domains/std.py:162
#, python-format
msgid "%scommand line option; %s"
msgstr "%s parametry příkazového řádku; %s"
-#: sphinx/domains/std.py:328
+#: sphinx/domains/std.py:393
msgid "glossary term"
msgstr ""
-#: sphinx/domains/std.py:329
+#: sphinx/domains/std.py:394
msgid "grammar token"
msgstr ""
-#: sphinx/domains/std.py:330
+#: sphinx/domains/std.py:395
msgid "reference label"
msgstr ""
-#: sphinx/domains/std.py:331
+#: sphinx/domains/std.py:396
msgid "environment variable"
msgstr "promměná prostředí"
-#: sphinx/domains/std.py:332
+#: sphinx/domains/std.py:397
msgid "program option"
msgstr ""
-#: sphinx/domains/std.py:360 sphinx/themes/basic/genindex-single.html:11
+#: sphinx/domains/std.py:427 sphinx/themes/basic/genindex-single.html:32
#: sphinx/themes/basic/genindex-split.html:11
#: sphinx/themes/basic/genindex-split.html:14
-#: sphinx/themes/basic/genindex.html:11 sphinx/themes/basic/genindex.html:14
-#: sphinx/themes/basic/genindex.html:50 sphinx/themes/basic/layout.html:125
-#: sphinx/writers/latex.py:173
+#: sphinx/themes/basic/genindex.html:32 sphinx/themes/basic/genindex.html:35
+#: sphinx/themes/basic/genindex.html:68 sphinx/themes/basic/layout.html:134
+#: sphinx/writers/latex.py:179 sphinx/writers/texinfo.py:456
msgid "Index"
msgstr "Index"
-#: sphinx/domains/std.py:361
+#: sphinx/domains/std.py:428
msgid "Module Index"
msgstr "Rejstřík modulů "
-#: sphinx/domains/std.py:362 sphinx/themes/basic/defindex.html:25
+#: sphinx/domains/std.py:429 sphinx/themes/basic/defindex.html:25
msgid "Search Page"
msgstr "Vyhledávací stránka"
-#: sphinx/ext/autodoc.py:917
+#: sphinx/ext/autodoc.py:1002
#, python-format
msgid " Bases: %s"
msgstr ""
-#: sphinx/ext/autodoc.py:950
+#: sphinx/ext/autodoc.py:1038
#, python-format
msgid "alias of :class:`%s`"
msgstr ""
@@ -400,110 +419,110 @@ msgstr "Todo"
#: sphinx/ext/todo.py:109
#, fuzzy, python-format
msgid "(The <<original entry>> is located in %s, line %d.)"
-msgstr "(Původní záznam je v %s, řádka %d a lze jej nalézt"
+msgstr "(Původní záznam je v %s, řádka %d.)"
#: sphinx/ext/todo.py:117
msgid "original entry"
msgstr ""
-#: sphinx/ext/viewcode.py:66
+#: sphinx/ext/viewcode.py:70
msgid "[source]"
msgstr ""
-#: sphinx/ext/viewcode.py:109
+#: sphinx/ext/viewcode.py:117
msgid "[docs]"
msgstr ""
-#: sphinx/ext/viewcode.py:123
+#: sphinx/ext/viewcode.py:131
#, fuzzy
msgid "Module code"
msgstr "modul"
-#: sphinx/ext/viewcode.py:129
+#: sphinx/ext/viewcode.py:137
#, python-format
msgid "<h1>Source code for %s</h1>"
msgstr ""
-#: sphinx/ext/viewcode.py:156
+#: sphinx/ext/viewcode.py:164
msgid "Overview: module code"
msgstr ""
-#: sphinx/ext/viewcode.py:157
+#: sphinx/ext/viewcode.py:165
msgid "<h1>All modules for which code is available</h1>"
msgstr ""
-#: sphinx/locale/__init__.py:139
+#: sphinx/locale/__init__.py:155
msgid "Attention"
msgstr "Výstraha"
-#: sphinx/locale/__init__.py:140
+#: sphinx/locale/__init__.py:156
msgid "Caution"
msgstr "Upozornění"
-#: sphinx/locale/__init__.py:141
+#: sphinx/locale/__init__.py:157
msgid "Danger"
msgstr "Nebezpečí"
-#: sphinx/locale/__init__.py:142
+#: sphinx/locale/__init__.py:158
msgid "Error"
msgstr "Chyba"
-#: sphinx/locale/__init__.py:143
+#: sphinx/locale/__init__.py:159
msgid "Hint"
msgstr "Rada"
-#: sphinx/locale/__init__.py:144
+#: sphinx/locale/__init__.py:160
msgid "Important"
msgstr "Důležité"
-#: sphinx/locale/__init__.py:145
+#: sphinx/locale/__init__.py:161
msgid "Note"
msgstr "Poznámka"
-#: sphinx/locale/__init__.py:146
+#: sphinx/locale/__init__.py:162
msgid "See Also"
msgstr "Viz také"
-#: sphinx/locale/__init__.py:147
+#: sphinx/locale/__init__.py:163
msgid "Tip"
msgstr "Tip"
-#: sphinx/locale/__init__.py:148
+#: sphinx/locale/__init__.py:164
msgid "Warning"
msgstr "Varování"
-#: sphinx/locale/__init__.py:152
+#: sphinx/locale/__init__.py:168
#, python-format
msgid "New in version %s"
msgstr "Nové ve verzi %s"
-#: sphinx/locale/__init__.py:153
+#: sphinx/locale/__init__.py:169
#, python-format
msgid "Changed in version %s"
msgstr "Změněno ve verzi %s"
-#: sphinx/locale/__init__.py:154
+#: sphinx/locale/__init__.py:170
#, python-format
msgid "Deprecated since version %s"
msgstr "Zastaralé od verze %s"
-#: sphinx/locale/__init__.py:159
+#: sphinx/locale/__init__.py:176
msgid "keyword"
msgstr "klíčové slovo"
-#: sphinx/locale/__init__.py:160
+#: sphinx/locale/__init__.py:177
msgid "operator"
msgstr "operátor"
-#: sphinx/locale/__init__.py:161
+#: sphinx/locale/__init__.py:178
msgid "object"
msgstr "objekt"
-#: sphinx/locale/__init__.py:163
+#: sphinx/locale/__init__.py:180
msgid "statement"
msgstr "příkaz"
-#: sphinx/locale/__init__.py:164
+#: sphinx/locale/__init__.py:181
msgid "built-in function"
msgstr "vestavěná funkce"
@@ -512,8 +531,8 @@ msgstr "vestavěná funkce"
msgid "Table Of Contents"
msgstr "Obsah"
-#: sphinx/themes/agogo/layout.html:49 sphinx/themes/basic/layout.html:128
-#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:14
+#: sphinx/themes/agogo/layout.html:49 sphinx/themes/basic/layout.html:137
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:20
msgid "Search"
msgstr "Hledání"
@@ -562,15 +581,15 @@ msgstr "rychlý přístup ke všem modulům"
msgid "all functions, classes, terms"
msgstr "všechny funkce, třídy, termíny"
-#: sphinx/themes/basic/genindex-single.html:14
+#: sphinx/themes/basic/genindex-single.html:35
#, python-format
msgid "Index &ndash; %(key)s"
msgstr "Index &ndash; %(key)s"
-#: sphinx/themes/basic/genindex-single.html:46
+#: sphinx/themes/basic/genindex-single.html:63
#: sphinx/themes/basic/genindex-split.html:24
#: sphinx/themes/basic/genindex-split.html:38
-#: sphinx/themes/basic/genindex.html:56
+#: sphinx/themes/basic/genindex.html:74
msgid "Full index on one page"
msgstr "Plný index na jedné stránce"
@@ -582,39 +601,39 @@ msgstr "Index podle písmene"
msgid "can be huge"
msgstr "může být obrovský"
-#: sphinx/themes/basic/layout.html:23
+#: sphinx/themes/basic/layout.html:29
msgid "Navigation"
msgstr "Navigace"
-#: sphinx/themes/basic/layout.html:113
+#: sphinx/themes/basic/layout.html:122
#, python-format
msgid "Search within %(docstitle)s"
msgstr "Hledání uvnitř %(docstitle)s"
-#: sphinx/themes/basic/layout.html:122
+#: sphinx/themes/basic/layout.html:131
msgid "About these documents"
msgstr "O těchto dokumentech"
-#: sphinx/themes/basic/layout.html:131
+#: sphinx/themes/basic/layout.html:140
msgid "Copyright"
msgstr "Veškerá práva vyhrazena"
-#: sphinx/themes/basic/layout.html:180
+#: sphinx/themes/basic/layout.html:189
#, python-format
msgid "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
msgstr "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
-#: sphinx/themes/basic/layout.html:182
+#: sphinx/themes/basic/layout.html:191
#, python-format
msgid "&copy; Copyright %(copyright)s."
msgstr "&copy; Copyright %(copyright)s."
-#: sphinx/themes/basic/layout.html:186
+#: sphinx/themes/basic/layout.html:195
#, python-format
msgid "Last updated on %(last_updated)s."
msgstr "Aktualizováno dne %(last_updated)s."
-#: sphinx/themes/basic/layout.html:189
+#: sphinx/themes/basic/layout.html:198
#, python-format
msgid ""
"Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
@@ -644,13 +663,13 @@ msgstr "Další téma"
msgid "next chapter"
msgstr "další kapitola"
-#: sphinx/themes/basic/search.html:18
+#: sphinx/themes/basic/search.html:24
msgid ""
"Please activate JavaScript to enable the search\n"
" functionality."
msgstr ""
-#: sphinx/themes/basic/search.html:23
+#: sphinx/themes/basic/search.html:29
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"
@@ -662,16 +681,15 @@ msgstr ""
"Vyhledávání hledá automaticky všechna slova. Nebudou tedy nalezeny "
"stránky, obsahující méně slov."
-#: sphinx/themes/basic/search.html:30
+#: sphinx/themes/basic/search.html:36
msgid "search"
msgstr "hledej"
-#: sphinx/themes/basic/search.html:34
-#: sphinx/themes/basic/static/searchtools.js:489
+#: sphinx/themes/basic/search.html:40
msgid "Search Results"
msgstr "Výsledky hledání"
-#: sphinx/themes/basic/search.html:36
+#: sphinx/themes/basic/search.html:42
msgid "Your search did not match any results."
msgstr "Nic jsme nenašli."
@@ -711,12 +729,12 @@ msgstr "Změny API"
msgid "Other changes"
msgstr "Ostatní změny"
-#: sphinx/themes/basic/static/doctools.js:154 sphinx/writers/html.py:482
-#: sphinx/writers/html.py:487
+#: sphinx/themes/basic/static/doctools.js:154 sphinx/writers/html.py:504
+#: sphinx/writers/html.py:510
msgid "Permalink to this headline"
msgstr "Trvalý odkaz na tento nadpis"
-#: sphinx/themes/basic/static/doctools.js:160 sphinx/writers/html.py:87
+#: sphinx/themes/basic/static/doctools.js:160 sphinx/writers/html.py:92
msgid "Permalink to this definition"
msgstr "Trvalý odkaz na tuto definici"
@@ -724,37 +742,12 @@ msgstr "Trvalý odkaz na tuto definici"
msgid "Hide Search Matches"
msgstr "Skrýt výsledky vyhledávání"
-#: sphinx/themes/basic/static/searchtools.js:285
-msgid "Searching"
-msgstr "Hledám"
-
-#: sphinx/themes/basic/static/searchtools.js:290
-msgid "Preparing search..."
-msgstr "Připravuji vyhledávání...."
-
-#: sphinx/themes/basic/static/searchtools.js:364
-msgid ", in "
-msgstr ", v"
-
-#: sphinx/themes/basic/static/searchtools.js:491
-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 ""
-"Nenalezli jsme žádný dokument. Ujistěte se prosím, že všechna slova jsou "
-"správně a že jste vybral dostatek kategorií."
-
-#: sphinx/themes/basic/static/searchtools.js:493
-#, python-format
-msgid "Search finished, found %s page(s) matching the search query."
-msgstr "Vyhledávání skončilo, nalezeno %s stran."
-
-#: sphinx/themes/default/static/sidebar.js:66
+#: sphinx/themes/default/static/sidebar.js:69
msgid "Expand sidebar"
msgstr ""
-#: sphinx/themes/default/static/sidebar.js:79
-#: sphinx/themes/default/static/sidebar.js:106
+#: sphinx/themes/default/static/sidebar.js:82
+#: sphinx/themes/default/static/sidebar.js:110
msgid "Collapse sidebar"
msgstr ""
@@ -762,23 +755,25 @@ msgstr ""
msgid "Contents"
msgstr ""
-#: sphinx/writers/latex.py:171
+#: sphinx/writers/latex.py:177
msgid "Release"
msgstr "Vydání"
-#: sphinx/writers/latex.py:572 sphinx/writers/manpage.py:178
+#: sphinx/writers/latex.py:594 sphinx/writers/manpage.py:182
+#: sphinx/writers/texinfo.py:589
msgid "Footnotes"
msgstr ""
-#: sphinx/writers/latex.py:641
+#: sphinx/writers/latex.py:676
msgid "continued from previous page"
msgstr ""
-#: sphinx/writers/latex.py:646
+#: sphinx/writers/latex.py:681
#, fuzzy
msgid "Continued on next page"
msgstr "Plný index na jedné stránce"
-#: sphinx/writers/text.py:422
+#: sphinx/writers/text.py:437
msgid "[image]"
msgstr "[obrázek]"
+
diff --git a/sphinx/locale/da/LC_MESSAGES/sphinx.js b/sphinx/locale/da/LC_MESSAGES/sphinx.js
index d17efc47..c28fab30 100644
--- a/sphinx/locale/da/LC_MESSAGES/sphinx.js
+++ b/sphinx/locale/da/LC_MESSAGES/sphinx.js
@@ -1 +1 @@
-Documentation.addTranslations({"locale": "da", "plural_expr": "(n != 1)", "messages": {"Search Results": "S\u00f8geresultater", "Preparing search...": "Forbereder s\u00f8gning...", "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "Din s\u00f8gning gav ingen resultater. Kontroll\u00e9r venligst at alle ord er stavet korrekt, og at du har valgt nok kategorier.", "Search finished, found %s page(s) matching the search query.": "S\u00f8gningen fuldf\u00f8rt - fandt %s sider for denne s\u00f8gning.", ", in ": ", i ", "Permalink to this headline": "Permalink til denne overskrift", "Searching": "S\u00f8ger", "Permalink to this definition": "Permalink til denne definition", "Hide Search Matches": "Skjul s\u00f8geresultater"}}); \ No newline at end of file
+Documentation.addTranslations({"locale": "da", "plural_expr": "(n != 1)", "messages": {"Hide Search Matches": "Skjul s\u00f8geresultater", "Permalink to this definition": "Permalink til denne definition", "Expand sidebar": "Udfold sidebj\u00e6lke", "Permalink to this headline": "Permalink til denne overskrift", "Collapse sidebar": "Sammenfold sidebj\u00e6lke"}}); \ No newline at end of file
diff --git a/sphinx/locale/da/LC_MESSAGES/sphinx.mo b/sphinx/locale/da/LC_MESSAGES/sphinx.mo
index a47f10de..d0006ee2 100644
--- a/sphinx/locale/da/LC_MESSAGES/sphinx.mo
+++ b/sphinx/locale/da/LC_MESSAGES/sphinx.mo
Binary files differ
diff --git a/sphinx/locale/da/LC_MESSAGES/sphinx.po b/sphinx/locale/da/LC_MESSAGES/sphinx.po
index c975e747..df991aec 100644
--- a/sphinx/locale/da/LC_MESSAGES/sphinx.po
+++ b/sphinx/locale/da/LC_MESSAGES/sphinx.po
@@ -1,509 +1,602 @@
-# Translations template for Sphinx.
-# Copyright (C) 2009 The Sphinx Team
+# Danish translations for Sphinx.
+# Copyright (C) 2009, 2011 The Sphinx Team
# This file is distributed under the same license as the Sphinx project.
#
-# Ask Hjorth Larsen <asklarsen@gmail.com>, 2010.
+# Ask Hjorth Larsen <asklarsen@gmail.com>, 2010, 2011.
msgid ""
msgstr ""
"Project-Id-Version: Sphinx 1.0pre/[?1034h2e1ab15e035e\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2009-11-08 16:28+0100\n"
-"PO-Revision-Date: 2010-06-03 23:47+0200\n"
+"POT-Creation-Date: 2011-09-21 10:06+0200\n"
+"PO-Revision-Date: 2011-01-22 14:41+0100\n"
"Last-Translator: Ask Hjorth Larsen <asklarsen@gmail.com>\n"
-"Language-Team: Danish <dansk@dansk-gruppen.dk\n"
+"Language-Team: Danish <dansk@dansk-gruppen.dk>\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"
+"Generated-By: Babel 0.9.6\n"
-# 21. april, 2010
-#: sphinx/environment.py:130 sphinx/writers/latex.py:184
+#: sphinx/config.py:81
+#, fuzzy, python-format
+msgid "%s %s documentation"
+msgstr "%s %s dokumentation"
+
+#: sphinx/environment.py:119 sphinx/writers/latex.py:190
+#: sphinx/writers/manpage.py:67 sphinx/writers/texinfo.py:203
#, python-format
msgid "%B %d, %Y"
msgstr "%d. %B, %Y"
-#: sphinx/environment.py:348 sphinx/themes/basic/genindex-single.html:2
-#: sphinx/themes/basic/genindex-split.html:2
-#: sphinx/themes/basic/genindex-split.html:5
-#: sphinx/themes/basic/genindex.html:2 sphinx/themes/basic/genindex.html:5
-#: sphinx/themes/basic/genindex.html:48 sphinx/themes/basic/layout.html:134
-#: sphinx/writers/latex.py:190
-msgid "Index"
-msgstr "Indeks"
-
-#: sphinx/environment.py:349 sphinx/writers/latex.py:189
-msgid "Module Index"
-msgstr "Modulindeks"
+#: sphinx/environment.py:1625
+#, python-format
+msgid "see %s"
+msgstr "se %s"
-# Ikke 'Søg på side'
-#: sphinx/environment.py:350 sphinx/themes/basic/defindex.html:16
-msgid "Search Page"
-msgstr "Søgeside"
+#: sphinx/environment.py:1628
+#, python-format
+msgid "see also %s"
+msgstr "se også %s"
-#: sphinx/roles.py:167
+#: sphinx/roles.py:175
#, python-format
-msgid "Python Enhancement Proposals!PEP %s"
-msgstr "Python Enhancement Proposals!PEP %s"
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr "Python Enhancement Proposals; PEP %s"
-#: sphinx/builders/changes.py:70
+#: sphinx/builders/changes.py:73
msgid "Builtins"
msgstr "Indbyggede"
-#: sphinx/builders/changes.py:72
+#: sphinx/builders/changes.py:75
msgid "Module level"
msgstr "Modulniveau"
-# Apr 21, 2010
-#: sphinx/builders/html.py:224
+#: sphinx/builders/html.py:274
#, python-format
msgid "%b %d, %Y"
msgstr "%d. %b, %Y"
-#: sphinx/builders/html.py:243 sphinx/themes/basic/defindex.html:21
+#: sphinx/builders/html.py:293 sphinx/themes/basic/defindex.html:30
msgid "General Index"
msgstr "Generelt indeks"
-#: sphinx/builders/html.py:243
+#: sphinx/builders/html.py:293
msgid "index"
msgstr "indeks"
-#: sphinx/builders/html.py:247 sphinx/builders/htmlhelp.py:220
-#: sphinx/builders/qthelp.py:133 sphinx/themes/basic/defindex.html:19
-#: sphinx/themes/basic/modindex.html:2 sphinx/themes/basic/modindex.html:13
-#: sphinx/themes/scrolls/modindex.html:2 sphinx/themes/scrolls/modindex.html:13
-msgid "Global Module Index"
-msgstr "Globalt modulindeks"
-
-#: sphinx/builders/html.py:248
-msgid "modules"
-msgstr "moduler"
-
-#: sphinx/builders/html.py:304
+#: sphinx/builders/html.py:353
msgid "next"
msgstr "næste"
-#: sphinx/builders/html.py:313
+#: sphinx/builders/html.py:362
msgid "previous"
msgstr "forrige"
-#: sphinx/builders/latex.py:162
+#: sphinx/builders/latex.py:141 sphinx/builders/texinfo.py:196
msgid " (in "
msgstr " (i "
-#: sphinx/directives/__init__.py:78 sphinx/directives/__init__.py:79
-#: sphinx/directives/__init__.py:80 sphinx/directives/__init__.py:81
-msgid "Raises"
-msgstr "Rejser"
-
-#: sphinx/directives/__init__.py:82 sphinx/directives/__init__.py:83
-#: sphinx/directives/__init__.py:84
-msgid "Variable"
-msgstr "Variabel"
-
-#: sphinx/directives/__init__.py:85 sphinx/directives/__init__.py:86
-#: sphinx/directives/__init__.py:92 sphinx/directives/__init__.py:93
-msgid "Returns"
-msgstr "Returnerer"
-
-#: sphinx/directives/__init__.py:94
-msgid "Return type"
-msgstr "Returtype"
-
-#: sphinx/directives/__init__.py:169
-msgid "Parameter"
-msgstr "Parameter"
-
-#: sphinx/directives/__init__.py:173
-msgid "Parameters"
-msgstr "Parametre"
-
-#: sphinx/directives/other.py:127
+#: sphinx/directives/other.py:136
msgid "Section author: "
msgstr "Afsnitsforfatter: "
-#: sphinx/directives/other.py:129
+#: sphinx/directives/other.py:138
msgid "Module author: "
msgstr "Modulforfatter: "
-#: sphinx/directives/other.py:131
+#: sphinx/directives/other.py:140
+msgid "Code author: "
+msgstr "Kodeforfatter: "
+
+#: sphinx/directives/other.py:142
msgid "Author: "
msgstr "Forfatter: "
-#: sphinx/directives/other.py:233
+#: sphinx/directives/other.py:215
msgid "See also"
msgstr "Se også"
-#: sphinx/domains/c.py:124
+#: sphinx/domains/__init__.py:244
+#, python-format
+msgid "%s %s"
+msgstr "%s %s"
+
+#: sphinx/domains/c.py:51 sphinx/domains/python.py:95
+msgid "Parameters"
+msgstr "Parametre"
+
+#: sphinx/domains/c.py:54 sphinx/domains/javascript.py:128
+#: sphinx/domains/python.py:107
+msgid "Returns"
+msgstr "Returnerer"
+
+#: sphinx/domains/c.py:56 sphinx/domains/python.py:109
+msgid "Return type"
+msgstr "Returtype"
+
+#: sphinx/domains/c.py:141
#, python-format
msgid "%s (C function)"
msgstr "%s (C-funktion)"
-#: sphinx/domains/c.py:126
+#: sphinx/domains/c.py:143
#, python-format
msgid "%s (C member)"
msgstr "%s (C-medlem)"
-#: sphinx/domains/c.py:128
+#: sphinx/domains/c.py:145
#, python-format
msgid "%s (C macro)"
msgstr "%s (C-makro)"
-#: sphinx/domains/c.py:130
+#: sphinx/domains/c.py:147
#, python-format
msgid "%s (C type)"
msgstr "%s (C-type)"
-#: sphinx/domains/c.py:132
+#: sphinx/domains/c.py:149
#, python-format
msgid "%s (C variable)"
msgstr "%s (C-variabel)"
-#: sphinx/domains/c.py:162
-msgid "C function"
-msgstr "C-funktion"
+#: sphinx/domains/c.py:204 sphinx/domains/cpp.py:1060
+#: sphinx/domains/javascript.py:162 sphinx/domains/python.py:559
+msgid "function"
+msgstr "funktion"
+
+#: sphinx/domains/c.py:205 sphinx/domains/cpp.py:1061
+msgid "member"
+msgstr "medlem"
+
+#: sphinx/domains/c.py:206
+msgid "macro"
+msgstr "makro"
+
+#: sphinx/domains/c.py:207 sphinx/domains/cpp.py:1062
+msgid "type"
+msgstr "type"
+
+#: sphinx/domains/c.py:208
+msgid "variable"
+msgstr "variabel"
+
+#: sphinx/domains/cpp.py:904
+#, python-format
+msgid "%s (C++ class)"
+msgstr "%s (C++-klasse)"
-#: sphinx/domains/c.py:163
-msgid "C member"
-msgstr "C-medlem"
+#: sphinx/domains/cpp.py:919
+#, python-format
+msgid "%s (C++ type)"
+msgstr "%s (C++-type)"
-#: sphinx/domains/c.py:164
-msgid "C macro"
-msgstr "C-makro"
+#: sphinx/domains/cpp.py:938
+#, python-format
+msgid "%s (C++ member)"
+msgstr "%s (C++-medlem)"
-#: sphinx/domains/c.py:165
-msgid "C type"
-msgstr "C-type"
+#: sphinx/domains/cpp.py:990
+#, python-format
+msgid "%s (C++ function)"
+msgstr "%s (C++-funktion)"
-#: sphinx/domains/c.py:166
-msgid "C variable"
-msgstr "C-variabel"
+#: sphinx/domains/cpp.py:1059 sphinx/domains/javascript.py:163
+#: sphinx/domains/python.py:561
+msgid "class"
+msgstr "klasse"
-#: sphinx/domains/python.py:186
+#: sphinx/domains/javascript.py:106 sphinx/domains/python.py:254
#, python-format
msgid "%s() (built-in function)"
msgstr "%s() (indbygget funktion)"
-#: sphinx/domains/python.py:187 sphinx/domains/python.py:244
-#: sphinx/domains/python.py:256 sphinx/domains/python.py:269
+#: sphinx/domains/javascript.py:107 sphinx/domains/python.py:318
+#, python-format
+msgid "%s() (%s method)"
+msgstr "%s() (metode i %s)"
+
+#: sphinx/domains/javascript.py:109
+#, python-format
+msgid "%s() (class)"
+msgstr "%s() (klasse)"
+
+#: sphinx/domains/javascript.py:111
+#, python-format
+msgid "%s (global variable or constant)"
+msgstr "%s (global variabel eller konstant)"
+
+#: sphinx/domains/javascript.py:113 sphinx/domains/python.py:356
+#, python-format
+msgid "%s (%s attribute)"
+msgstr "%s (attribut i %s)"
+
+#: sphinx/domains/javascript.py:122
+msgid "Arguments"
+msgstr "Parametre"
+
+#: sphinx/domains/javascript.py:125
+msgid "Throws"
+msgstr "Kaster"
+
+#: sphinx/domains/javascript.py:164 sphinx/domains/python.py:560
+msgid "data"
+msgstr "data"
+
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:566
+msgid "attribute"
+msgstr "attribut"
+
+#: sphinx/domains/python.py:100
+msgid "Variables"
+msgstr "Variable"
+
+#: sphinx/domains/python.py:104
+msgid "Raises"
+msgstr "Rejser"
+
+#: sphinx/domains/python.py:255 sphinx/domains/python.py:312
+#: sphinx/domains/python.py:324 sphinx/domains/python.py:337
#, python-format
msgid "%s() (in module %s)"
msgstr "%s() (i modulet %s)"
-#: sphinx/domains/python.py:190
+#: sphinx/domains/python.py:258
#, python-format
msgid "%s (built-in variable)"
msgstr "%s (indbygget variabel)"
-#: sphinx/domains/python.py:191 sphinx/domains/python.py:282
+#: sphinx/domains/python.py:259 sphinx/domains/python.py:350
#, python-format
msgid "%s (in module %s)"
msgstr "%s (i modulet %s)"
-#: sphinx/domains/python.py:207
+#: sphinx/domains/python.py:275
#, python-format
msgid "%s (built-in class)"
msgstr "%s (indbygget klasse)"
-#: sphinx/domains/python.py:208
+#: sphinx/domains/python.py:276
#, python-format
msgid "%s (class in %s)"
msgstr "%s (klasse i %s)"
-#: sphinx/domains/python.py:248
+#: sphinx/domains/python.py:316
#, python-format
msgid "%s() (%s.%s method)"
msgstr "%s() (metode i %s.%s)"
-#: sphinx/domains/python.py:250
-#, python-format
-msgid "%s() (%s method)"
-msgstr "%s() (metode i %s)"
-
-#: sphinx/domains/python.py:260
+#: sphinx/domains/python.py:328
#, python-format
msgid "%s() (%s.%s static method)"
msgstr "%s() (statisk metode i %s.%s)"
-#: sphinx/domains/python.py:263
+#: sphinx/domains/python.py:331
#, python-format
msgid "%s() (%s static method)"
msgstr "%s() (statisk metode i %s)"
-#: sphinx/domains/python.py:273
+#: sphinx/domains/python.py:341
#, python-format
msgid "%s() (%s.%s class method)"
msgstr "%s() (klassemetode i %s.%s)"
-#: sphinx/domains/python.py:276
+#: sphinx/domains/python.py:344
#, python-format
msgid "%s() (%s class method)"
msgstr "%s() (klassemetode i %s)"
-#: sphinx/domains/python.py:286
+#: sphinx/domains/python.py:354
#, python-format
msgid "%s (%s.%s attribute)"
msgstr "%s (attribut i %s.%s)"
-#: sphinx/domains/python.py:288
-#, python-format
-msgid "%s (%s attribute)"
-msgstr "%s (attribut i %s)"
-
-#: sphinx/domains/python.py:334
-msgid "Platforms: "
-msgstr "Platforme: "
-
-#: sphinx/domains/python.py:340
+#: sphinx/domains/python.py:434
#, python-format
msgid "%s (module)"
msgstr "%s (modul)"
-#: sphinx/domains/python.py:396
-msgid "function"
-msgstr "funktion"
+#: sphinx/domains/python.py:491
+msgid "Python Module Index"
+msgstr "Python-modulindeks"
-#: sphinx/domains/python.py:397
-msgid "data"
-msgstr "data"
+#: sphinx/domains/python.py:492
+msgid "modules"
+msgstr "moduler"
-#: sphinx/domains/python.py:398
-msgid "class"
-msgstr "klasse"
+#: sphinx/domains/python.py:537
+msgid "Deprecated"
+msgstr "Forældet"
-#: sphinx/domains/python.py:399 sphinx/locale/__init__.py:161
+#: sphinx/domains/python.py:562 sphinx/locale/__init__.py:179
msgid "exception"
msgstr "undtagelse"
-#: sphinx/domains/python.py:400
+#: sphinx/domains/python.py:563
msgid "method"
msgstr "metode"
-#: sphinx/domains/python.py:401
-msgid "attribute"
-msgstr "attribut"
+#: sphinx/domains/python.py:564
+msgid "class method"
+msgstr "klassemetode"
-#: sphinx/domains/python.py:402 sphinx/locale/__init__.py:157
+#: sphinx/domains/python.py:565
+msgid "static method"
+msgstr "statisk metode"
+
+#: sphinx/domains/python.py:567 sphinx/locale/__init__.py:175
msgid "module"
msgstr "modul"
-#: sphinx/domains/std.py:67 sphinx/domains/std.py:83
+#: sphinx/domains/python.py:695
+msgid " (deprecated)"
+msgstr " (forældet)"
+
+#: sphinx/domains/rst.py:55
+#, python-format
+msgid "%s (directive)"
+msgstr "%s (direktiv)"
+
+#: sphinx/domains/rst.py:57
+#, python-format
+msgid "%s (role)"
+msgstr "%s (rolle)"
+
+#: sphinx/domains/rst.py:106
+msgid "directive"
+msgstr "direktiv"
+
+#: sphinx/domains/rst.py:107
+msgid "role"
+msgstr "rolle"
+
+#: sphinx/domains/std.py:70 sphinx/domains/std.py:86
#, python-format
msgid "environment variable; %s"
msgstr "miljøvariabel; %s"
-#: sphinx/domains/std.py:156
+#: sphinx/domains/std.py:162
#, python-format
msgid "%scommand line option; %s"
msgstr "%skommandolinjetilvalg; %s"
-#: sphinx/domains/std.py:324
+#: sphinx/domains/std.py:393
msgid "glossary term"
msgstr "begreb i ordliste"
-#: sphinx/domains/std.py:325
+#: sphinx/domains/std.py:394
msgid "grammar token"
msgstr "grammatisk element"
-#: sphinx/domains/std.py:326
+#: sphinx/domains/std.py:395
+msgid "reference label"
+msgstr "referenceetiket"
+
+#: sphinx/domains/std.py:396
msgid "environment variable"
msgstr "miljøvariabel"
-#: sphinx/domains/std.py:327
+#: sphinx/domains/std.py:397
msgid "program option"
msgstr "programtilvalg"
-#: sphinx/ext/autodoc.py:892
+#: sphinx/domains/std.py:427 sphinx/themes/basic/genindex-single.html:32
+#: sphinx/themes/basic/genindex-split.html:11
+#: sphinx/themes/basic/genindex-split.html:14
+#: sphinx/themes/basic/genindex.html:32 sphinx/themes/basic/genindex.html:35
+#: sphinx/themes/basic/genindex.html:68 sphinx/themes/basic/layout.html:134
+#: sphinx/writers/latex.py:179 sphinx/writers/texinfo.py:456
+msgid "Index"
+msgstr "Indeks"
+
+#: sphinx/domains/std.py:428
+msgid "Module Index"
+msgstr "Modulindeks"
+
+#: sphinx/domains/std.py:429 sphinx/themes/basic/defindex.html:25
+msgid "Search Page"
+msgstr "Søgeside"
+
+#: sphinx/ext/autodoc.py:1002
#, python-format
msgid " Bases: %s"
msgstr " Baser: %s"
-#: sphinx/ext/autodoc.py:925
+#: sphinx/ext/autodoc.py:1038
#, python-format
msgid "alias of :class:`%s`"
msgstr "alias for :class:`%s`"
-#: sphinx/ext/todo.py:40
+#: sphinx/ext/todo.py:41
msgid "Todo"
msgstr "Todo"
-#: sphinx/ext/todo.py:98
+#: sphinx/ext/todo.py:109
+#, python-format
+msgid "(The <<original entry>> is located in %s, line %d.)"
+msgstr "(Det <<oprindelige punkt>> befinder sig i %s, linje %d.)"
+
+#: sphinx/ext/todo.py:117
+msgid "original entry"
+msgstr "oprindeligt punkt"
+
+#: sphinx/ext/viewcode.py:70
+msgid "[source]"
+msgstr "[kilde]"
+
+#: sphinx/ext/viewcode.py:117
+msgid "[docs]"
+msgstr "[dok]"
+
+#: sphinx/ext/viewcode.py:131
+msgid "Module code"
+msgstr "Modulkode"
+
+#: sphinx/ext/viewcode.py:137
#, python-format
-msgid "(The original entry is located in %s, line %d and can be found "
-msgstr "(Det oprindelige punkt befinder sig i %s, linje %d, og kan findes "
+msgid "<h1>Source code for %s</h1>"
+msgstr "<h1>Kildekode for %s</h1>"
-#: sphinx/ext/todo.py:104
-msgid "here"
-msgstr "her"
+#: sphinx/ext/viewcode.py:164
+msgid "Overview: module code"
+msgstr "Oversigt: modulkode"
-#: sphinx/locale/__init__.py:138
+#: sphinx/ext/viewcode.py:165
+msgid "<h1>All modules for which code is available</h1>"
+msgstr "<h1>Alle moduler, der er kode tilgængelig for</h1>"
+
+#: sphinx/locale/__init__.py:155
msgid "Attention"
msgstr "Vær opmærksom"
-#: sphinx/locale/__init__.py:139
+#: sphinx/locale/__init__.py:156
msgid "Caution"
msgstr "Forsigtig"
-#: sphinx/locale/__init__.py:140
+#: sphinx/locale/__init__.py:157
msgid "Danger"
msgstr "Fare"
-#: sphinx/locale/__init__.py:141
+#: sphinx/locale/__init__.py:158
msgid "Error"
msgstr "Fejl"
-#: sphinx/locale/__init__.py:142
+#: sphinx/locale/__init__.py:159
msgid "Hint"
msgstr "Fif"
-#: sphinx/locale/__init__.py:143
+#: sphinx/locale/__init__.py:160
msgid "Important"
msgstr "Vigtigt"
-#: sphinx/locale/__init__.py:144
+#: sphinx/locale/__init__.py:161
msgid "Note"
msgstr "Bemærk"
-#: sphinx/locale/__init__.py:145
+#: sphinx/locale/__init__.py:162
msgid "See Also"
msgstr "Se også"
-#: sphinx/locale/__init__.py:146
+#: sphinx/locale/__init__.py:163
msgid "Tip"
msgstr "Tip"
-#: sphinx/locale/__init__.py:147
+#: sphinx/locale/__init__.py:164
msgid "Warning"
msgstr "Advarsel"
-#: sphinx/locale/__init__.py:151
+#: sphinx/locale/__init__.py:168
#, python-format
msgid "New in version %s"
msgstr "Ny i version %s"
-#: sphinx/locale/__init__.py:152
+#: sphinx/locale/__init__.py:169
#, python-format
msgid "Changed in version %s"
msgstr "Ændret i version %s"
-#: sphinx/locale/__init__.py:153
+#: sphinx/locale/__init__.py:170
#, python-format
msgid "Deprecated since version %s"
-msgstr "Deprecieret siden version %s"
+msgstr "Forældet siden version %s"
-#: sphinx/locale/__init__.py:158
+#: sphinx/locale/__init__.py:176
msgid "keyword"
msgstr "nøgleord"
-#: sphinx/locale/__init__.py:159
+#: sphinx/locale/__init__.py:177
msgid "operator"
msgstr "operator"
-#: sphinx/locale/__init__.py:160
+#: sphinx/locale/__init__.py:178
msgid "object"
msgstr "objekt"
-#: sphinx/locale/__init__.py:162
+#: sphinx/locale/__init__.py:180
msgid "statement"
msgstr "erklæring"
-#: sphinx/locale/__init__.py:163
+#: sphinx/locale/__init__.py:181
msgid "built-in function"
msgstr "indbygget funktion"
-#: sphinx/themes/basic/defindex.html:2
+#: sphinx/themes/agogo/layout.html:45 sphinx/themes/basic/globaltoc.html:10
+#: sphinx/themes/basic/localtoc.html:11
+msgid "Table Of Contents"
+msgstr "Indholdsfortegnelse"
+
+#: sphinx/themes/agogo/layout.html:49 sphinx/themes/basic/layout.html:137
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:20
+msgid "Search"
+msgstr "Søg"
+
+#: sphinx/themes/agogo/layout.html:52 sphinx/themes/basic/searchbox.html:15
+msgid "Go"
+msgstr "Søg"
+
+#: sphinx/themes/agogo/layout.html:57 sphinx/themes/basic/searchbox.html:20
+msgid "Enter search terms or a module, class or function name."
+msgstr "Indtast søgeord eller navnet på et modul, en klasse eller en funktion."
+
+#: sphinx/themes/agogo/layout.html:78 sphinx/themes/basic/sourcelink.html:14
+msgid "Show Source"
+msgstr "Vis kilde"
+
+#: sphinx/themes/basic/defindex.html:11
msgid "Overview"
msgstr "Oversigt"
-#: sphinx/themes/basic/defindex.html:11
+#: sphinx/themes/basic/defindex.html:20
msgid "Indices and tables:"
msgstr "Indeks og tabeller:"
-#: sphinx/themes/basic/defindex.html:14
+#: sphinx/themes/basic/defindex.html:23
msgid "Complete Table of Contents"
msgstr "Fuldstændig indholdsfortegnelse"
-#: sphinx/themes/basic/defindex.html:15
+#: sphinx/themes/basic/defindex.html:24
msgid "lists all sections and subsections"
msgstr "viser alle afsnit og underafsnit"
-#: sphinx/themes/basic/defindex.html:17
+#: sphinx/themes/basic/defindex.html:26
msgid "search this documentation"
msgstr "søg i denne dokumentation"
-#: sphinx/themes/basic/defindex.html:20
+#: sphinx/themes/basic/defindex.html:28
+msgid "Global Module Index"
+msgstr "Globalt modulindeks"
+
+#: sphinx/themes/basic/defindex.html:29
msgid "quick access to all modules"
msgstr "hurtig adgang til alle moduler"
-#: sphinx/themes/basic/defindex.html:22
+#: sphinx/themes/basic/defindex.html:31
msgid "all functions, classes, terms"
msgstr "alle funktioner, klasser, begreber"
-#: sphinx/themes/basic/genindex-single.html:5
+#: sphinx/themes/basic/genindex-single.html:35
#, python-format
msgid "Index &ndash; %(key)s"
msgstr "Indeks &ndash; %(key)s"
-#: sphinx/themes/basic/genindex-single.html:44
-#: sphinx/themes/basic/genindex-split.html:14
-#: sphinx/themes/basic/genindex-split.html:27
-#: sphinx/themes/basic/genindex.html:54
+#: sphinx/themes/basic/genindex-single.html:63
+#: sphinx/themes/basic/genindex-split.html:24
+#: sphinx/themes/basic/genindex-split.html:38
+#: sphinx/themes/basic/genindex.html:74
msgid "Full index on one page"
msgstr "Fuldt indeks på én side"
-#: sphinx/themes/basic/genindex-split.html:7
+#: sphinx/themes/basic/genindex-split.html:16
msgid "Index pages by letter"
msgstr "Indeksér sider efter bogstav"
-# refererer til indeks
-#: sphinx/themes/basic/genindex-split.html:15
+#: sphinx/themes/basic/genindex-split.html:25
msgid "can be huge"
msgstr "kan være enormt"
-#: sphinx/themes/basic/layout.html:10
+#: sphinx/themes/basic/layout.html:29
msgid "Navigation"
msgstr "Navigation"
-#: sphinx/themes/basic/layout.html:42
-msgid "Table Of Contents"
-msgstr "Indholdsfortegnelse"
-
-#: sphinx/themes/basic/layout.html:48
-msgid "Previous topic"
-msgstr "Forrige emne"
-
-#: sphinx/themes/basic/layout.html:50
-msgid "previous chapter"
-msgstr "forrige kapitel"
-
-#: sphinx/themes/basic/layout.html:53
-msgid "Next topic"
-msgstr "Næste emne"
-
-#: sphinx/themes/basic/layout.html:55
-msgid "next chapter"
-msgstr "næste kapitel"
-
-#: sphinx/themes/basic/layout.html:60
-msgid "This Page"
-msgstr "Denne side"
-
-#: sphinx/themes/basic/layout.html:63
-msgid "Show Source"
-msgstr "Vis kilde"
-
-#: sphinx/themes/basic/layout.html:73
-msgid "Quick search"
-msgstr "Hurtig søgning"
-
-# Referencen fra layout.html:76 er til en søgeknap
-#: sphinx/themes/basic/layout.html:76
-msgid "Go"
-msgstr "Søg"
-
-#: sphinx/themes/basic/layout.html:81
-msgid "Enter search terms or a module, class or function name."
-msgstr "Indtast søgeord eller navnet på et modul, en klasse eller en funktion."
-
#: sphinx/themes/basic/layout.html:122
#, python-format
msgid "Search within %(docstitle)s"
@@ -513,48 +606,56 @@ msgstr "Søg i %(docstitle)s"
msgid "About these documents"
msgstr "Om disse dokumenter"
-#: sphinx/themes/basic/layout.html:137 sphinx/themes/basic/search.html:2
-#: sphinx/themes/basic/search.html:5
-msgid "Search"
-msgstr "Søg"
-
#: sphinx/themes/basic/layout.html:140
msgid "Copyright"
msgstr "Ophavsret"
-#: sphinx/themes/basic/layout.html:187 sphinx/themes/scrolls/layout.html:83
+#: sphinx/themes/basic/layout.html:189
#, python-format
msgid "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
msgstr "&copy; <a href=\"%(path)s\">Ophavsret</a> %(copyright)s."
-#: sphinx/themes/basic/layout.html:189 sphinx/themes/scrolls/layout.html:85
+#: sphinx/themes/basic/layout.html:191
#, python-format
msgid "&copy; Copyright %(copyright)s."
msgstr "&copy; Ophavsret %(copyright)s."
-# datoformatet passer ikke med "den %(last_updated)s"
-#: sphinx/themes/basic/layout.html:193 sphinx/themes/scrolls/layout.html:89
+#: sphinx/themes/basic/layout.html:195
#, python-format
msgid "Last updated on %(last_updated)s."
msgstr "Sidst opdateret %(last_updated)s."
-#: sphinx/themes/basic/layout.html:196 sphinx/themes/scrolls/layout.html:92
+#: sphinx/themes/basic/layout.html:198
#, python-format
msgid ""
"Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
"%(sphinx_version)s."
-msgstr "Bygget med <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> %(sphinx_version)s."
-
-#: sphinx/themes/basic/modindex.html:36 sphinx/themes/scrolls/modindex.html:37
-msgid "Deprecated"
-msgstr "Deprecieret"
+msgstr ""
+"Bygget med <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
+"%(sphinx_version)s."
#: sphinx/themes/basic/opensearch.xml:4
#, python-format
msgid "Search %(docstitle)s"
msgstr "Søg i %(docstitle)s"
-#: sphinx/themes/basic/search.html:9
+#: sphinx/themes/basic/relations.html:11
+msgid "Previous topic"
+msgstr "Forrige emne"
+
+#: sphinx/themes/basic/relations.html:13
+msgid "previous chapter"
+msgstr "forrige kapitel"
+
+#: sphinx/themes/basic/relations.html:16
+msgid "Next topic"
+msgstr "Næste emne"
+
+#: sphinx/themes/basic/relations.html:18
+msgid "next chapter"
+msgstr "næste kapitel"
+
+#: sphinx/themes/basic/search.html:24
msgid ""
"Please activate JavaScript to enable the search\n"
" functionality."
@@ -562,7 +663,7 @@ msgstr ""
"Aktivér venligst JavaScript for at aktivere\n"
" søgefunktionalitet."
-#: sphinx/themes/basic/search.html:14
+#: sphinx/themes/basic/search.html:29
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"
@@ -574,19 +675,26 @@ msgstr ""
" automatisk vil søge på alle ordene. Sider, der indeholder\n"
" færre ord, vil ikke indgå i resultaterne."
-#: sphinx/themes/basic/search.html:21
+#: sphinx/themes/basic/search.html:36
msgid "search"
msgstr "søg"
-#: sphinx/themes/basic/search.html:25
-#: sphinx/themes/basic/static/searchtools.js:473
+#: sphinx/themes/basic/search.html:40
msgid "Search Results"
msgstr "Søgeresultater"
-#: sphinx/themes/basic/search.html:27
+#: sphinx/themes/basic/search.html:42
msgid "Your search did not match any results."
msgstr "Din søgning gav ingen resultater."
+#: sphinx/themes/basic/searchbox.html:12
+msgid "Quick search"
+msgstr "Hurtig søgning"
+
+#: sphinx/themes/basic/sourcelink.html:11
+msgid "This Page"
+msgstr "Denne side"
+
#: sphinx/themes/basic/changes/frameset.html:5
#: sphinx/themes/basic/changes/versionchanges.html:12
#, python-format
@@ -615,64 +723,50 @@ msgstr "Ændringer i C-API"
msgid "Other changes"
msgstr "Andre ændringer"
-#: sphinx/themes/basic/static/doctools.js:138 sphinx/writers/html.py:462
-#: sphinx/writers/html.py:467
+#: sphinx/themes/basic/static/doctools.js:154 sphinx/writers/html.py:504
+#: sphinx/writers/html.py:510
msgid "Permalink to this headline"
msgstr "Permalink til denne overskrift"
-#: sphinx/themes/basic/static/doctools.js:144 sphinx/writers/html.py:80
+#: sphinx/themes/basic/static/doctools.js:160 sphinx/writers/html.py:92
msgid "Permalink to this definition"
msgstr "Permalink til denne definition"
-#: sphinx/themes/basic/static/doctools.js:173
+#: sphinx/themes/basic/static/doctools.js:189
msgid "Hide Search Matches"
msgstr "Skjul søgeresultater"
-#: sphinx/themes/basic/static/searchtools.js:274
-msgid "Searching"
-msgstr "Søger"
+#: sphinx/themes/default/static/sidebar.js:69
+msgid "Expand sidebar"
+msgstr "Udfold sidebjælke"
-#: sphinx/themes/basic/static/searchtools.js:279
-msgid "Preparing search..."
-msgstr "Forbereder søgning..."
+#: sphinx/themes/default/static/sidebar.js:82
+#: sphinx/themes/default/static/sidebar.js:110
+msgid "Collapse sidebar"
+msgstr "Sammenfold sidebjælke"
-#: sphinx/themes/basic/static/searchtools.js:352
-msgid ", in "
-msgstr ", i "
+#: sphinx/themes/haiku/layout.html:26
+msgid "Contents"
+msgstr "Indhold"
-#: sphinx/themes/basic/static/searchtools.js:475
-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 "Din søgning gav ingen resultater. Kontrollér venligst at alle ord er stavet korrekt, og at du har valgt nok kategorier."
-
-#: sphinx/themes/basic/static/searchtools.js:477
-#, python-format
-msgid "Search finished, found %s page(s) matching the search query."
-msgstr "Søgningen fuldført - fandt %s sider for denne søgning."
-
-#: sphinx/writers/latex.py:187
+#: sphinx/writers/latex.py:177
msgid "Release"
msgstr "Udgave"
-#: sphinx/writers/latex.py:579
+#: sphinx/writers/latex.py:594 sphinx/writers/manpage.py:182
+#: sphinx/writers/texinfo.py:589
msgid "Footnotes"
msgstr "Fodnoter"
-#: sphinx/writers/latex.py:647
+#: sphinx/writers/latex.py:676
msgid "continued from previous page"
msgstr "fortsat fra forrige side"
-#: sphinx/writers/latex.py:652
+#: sphinx/writers/latex.py:681
msgid "Continued on next page"
msgstr "Fortsættes på næste side"
-#: sphinx/writers/text.py:166
-#, python-format
-msgid "Platform: %s"
-msgstr "Platform: %s"
-
-#: sphinx/writers/text.py:428
+#: sphinx/writers/text.py:437
msgid "[image]"
msgstr "[billede]"
diff --git a/sphinx/locale/de/LC_MESSAGES/sphinx.js b/sphinx/locale/de/LC_MESSAGES/sphinx.js
index 5409d6d9..665492b1 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": {"Search Results": "Suchergebnisse", "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 zutreffenden Dokumente gefunden. Haben Sie alle Suchbegriffe richtig geschrieben und gen\u00fcgend Kategorien ausgew\u00e4hlt?", "Search finished, found %s page(s) matching the search query.": "Suche beendet, %s zutreffende Seite(n) gefunden.", ", in ": ", in ", "Expand sidebar": "Sidebar ausklappen", "Permalink to this headline": "Permalink zu dieser \u00dcberschrift", "Searching": "Suche...", "Collapse sidebar": "Sidebar einklappen", "Permalink to this definition": "Permalink zu dieser Definition", "Hide Search Matches": "Suchergebnisse ausblenden"}}); \ No newline at end of file
+Documentation.addTranslations({"locale": "de", "plural_expr": "(n != 1)", "messages": {"Hide Search Matches": "Suchergebnisse ausblenden", "Permalink to this definition": "Permalink zu dieser Definition", "Expand sidebar": "Sidebar ausklappen", "Permalink to this headline": "Permalink zu dieser \u00dcberschrift", "Collapse sidebar": "Sidebar einklappen"}}); \ 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 abecb480..ce12882d 100644
--- a/sphinx/locale/de/LC_MESSAGES/sphinx.mo
+++ b/sphinx/locale/de/LC_MESSAGES/sphinx.mo
Binary files differ
diff --git a/sphinx/locale/de/LC_MESSAGES/sphinx.po b/sphinx/locale/de/LC_MESSAGES/sphinx.po
index 83e6fabe..50ba7490 100644
--- a/sphinx/locale/de/LC_MESSAGES/sphinx.po
+++ b/sphinx/locale/de/LC_MESSAGES/sphinx.po
@@ -6,383 +6,401 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2008-08-07 21:40+0200\n"
-"PO-Revision-Date: 2010-05-24 23:54+0200\n"
+"POT-Creation-Date: 2011-09-21 10:06+0200\n"
+"PO-Revision-Date: 2011-01-22 14:41+0100\n"
"Last-Translator: Georg Brandl <georg@python.org>\n"
"Language-Team: de <LL@li.org>\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"
+"Generated-By: Babel 0.9.6\n"
-#: sphinx/environment.py:106 sphinx/writers/latex.py:184
-#: sphinx/writers/manpage.py:67
+#: sphinx/config.py:81
+#, python-format
+msgid "%s %s documentation"
+msgstr "%s %s Dokumentation"
+
+#: sphinx/environment.py:119 sphinx/writers/latex.py:190
+#: sphinx/writers/manpage.py:67 sphinx/writers/texinfo.py:203
#, python-format
msgid "%B %d, %Y"
msgstr "%d. %m. %Y"
-#: sphinx/roles.py:174
+#: sphinx/environment.py:1625
+#, python-format
+msgid "see %s"
+msgstr "siehe %s"
+
+#: sphinx/environment.py:1628
+#, python-format
+msgid "see also %s"
+msgstr "siehe auch %s"
+
+#: sphinx/roles.py:175
#, python-format
-msgid "Python Enhancement Proposals!PEP %s"
-msgstr "Python Enhancement Proposals!PEP %s"
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr "Python Enhancement Proposals; PEP %s"
-#: sphinx/builders/changes.py:72
+#: sphinx/builders/changes.py:73
msgid "Builtins"
msgstr "Builtins"
-#: sphinx/builders/changes.py:74
+#: sphinx/builders/changes.py:75
msgid "Module level"
msgstr "Modulebene"
-#: sphinx/builders/html.py:266
+#: sphinx/builders/html.py:274
#, python-format
msgid "%b %d, %Y"
msgstr "%d. %m. %Y"
-#: sphinx/builders/html.py:285 sphinx/themes/basic/defindex.html:30
+#: sphinx/builders/html.py:293 sphinx/themes/basic/defindex.html:30
msgid "General Index"
msgstr "Allgemeiner Index"
-#: sphinx/builders/html.py:285
+#: sphinx/builders/html.py:293
msgid "index"
msgstr "Index"
-#: sphinx/builders/html.py:345
+#: sphinx/builders/html.py:353
msgid "next"
msgstr "weiter"
-#: sphinx/builders/html.py:354
+#: sphinx/builders/html.py:362
msgid "previous"
msgstr "zurück"
-#: sphinx/builders/latex.py:151
+#: sphinx/builders/latex.py:141 sphinx/builders/texinfo.py:196
msgid " (in "
msgstr " (in "
-#: sphinx/directives/other.py:127
+#: sphinx/directives/other.py:136
msgid "Section author: "
msgstr "Autor des Abschnitts: "
-#: sphinx/directives/other.py:129
+#: sphinx/directives/other.py:138
msgid "Module author: "
msgstr "Autor des Moduls: "
-#: sphinx/directives/other.py:131
+#: sphinx/directives/other.py:140
msgid "Code author: "
msgstr "Autor des Quellcode: "
-#: sphinx/directives/other.py:133
+#: sphinx/directives/other.py:142
msgid "Author: "
msgstr "Autor: "
-#: sphinx/directives/other.py:238
+#: sphinx/directives/other.py:215
msgid "See also"
msgstr "Siehe auch"
-#: sphinx/domains/__init__.py:253
+#: sphinx/domains/__init__.py:244
#, python-format
msgid "%s %s"
msgstr "%s-%s"
-#: sphinx/domains/c.py:51 sphinx/domains/python.py:49
+#: sphinx/domains/c.py:51 sphinx/domains/python.py:95
msgid "Parameters"
msgstr "Parameter"
-#: sphinx/domains/c.py:54 sphinx/domains/javascript.py:137
-#: sphinx/domains/python.py:59
+#: sphinx/domains/c.py:54 sphinx/domains/javascript.py:128
+#: sphinx/domains/python.py:107
msgid "Returns"
msgstr "Rückgabe"
-#: sphinx/domains/c.py:56 sphinx/domains/python.py:61
+#: sphinx/domains/c.py:56 sphinx/domains/python.py:109
msgid "Return type"
msgstr "Rückgabetyp"
-#: sphinx/domains/c.py:133
+#: sphinx/domains/c.py:141
#, python-format
msgid "%s (C function)"
msgstr "%s (C-Funktion)"
-#: sphinx/domains/c.py:135
+#: sphinx/domains/c.py:143
#, python-format
msgid "%s (C member)"
msgstr "%s (C-Member)"
-#: sphinx/domains/c.py:137
+#: sphinx/domains/c.py:145
#, python-format
msgid "%s (C macro)"
msgstr "%s (C-Makro)"
-#: sphinx/domains/c.py:139
+#: sphinx/domains/c.py:147
#, python-format
msgid "%s (C type)"
msgstr "%s (C-Typ)"
-#: sphinx/domains/c.py:141
+#: sphinx/domains/c.py:149
#, python-format
msgid "%s (C variable)"
msgstr "%s (C-Variable)"
-#: sphinx/domains/c.py:171 sphinx/domains/cpp.py:1031
-#: sphinx/domains/javascript.py:166 sphinx/domains/python.py:497
+#: sphinx/domains/c.py:204 sphinx/domains/cpp.py:1060
+#: sphinx/domains/javascript.py:162 sphinx/domains/python.py:559
msgid "function"
msgstr "Funktion"
-#: sphinx/domains/c.py:172 sphinx/domains/cpp.py:1032
+#: sphinx/domains/c.py:205 sphinx/domains/cpp.py:1061
msgid "member"
msgstr "Member"
-#: sphinx/domains/c.py:173
+#: sphinx/domains/c.py:206
msgid "macro"
msgstr "Makro"
-#: sphinx/domains/c.py:174 sphinx/domains/cpp.py:1033
+#: sphinx/domains/c.py:207 sphinx/domains/cpp.py:1062
msgid "type"
msgstr "Typ"
-#: sphinx/domains/c.py:175
+#: sphinx/domains/c.py:208
msgid "variable"
msgstr "Variable"
-#: sphinx/domains/cpp.py:876
+#: sphinx/domains/cpp.py:904
#, python-format
msgid "%s (C++ class)"
msgstr "%s (C++-Klasse)"
-#: sphinx/domains/cpp.py:891
+#: sphinx/domains/cpp.py:919
#, python-format
msgid "%s (C++ type)"
msgstr "%s (C++-Typ)"
-#: sphinx/domains/cpp.py:910
+#: sphinx/domains/cpp.py:938
#, python-format
msgid "%s (C++ member)"
msgstr "%s (C++-Member)"
-#: sphinx/domains/cpp.py:962
+#: sphinx/domains/cpp.py:990
#, python-format
msgid "%s (C++ function)"
msgstr "%s (C++-Funktion)"
-#: sphinx/domains/cpp.py:1030 sphinx/domains/python.py:499
+#: sphinx/domains/cpp.py:1059 sphinx/domains/javascript.py:163
+#: sphinx/domains/python.py:561
msgid "class"
msgstr "Klasse"
-#: sphinx/domains/javascript.py:117 sphinx/domains/python.py:221
+#: sphinx/domains/javascript.py:106 sphinx/domains/python.py:254
#, python-format
msgid "%s() (built-in function)"
msgstr "%s() (Standard-Funktion)"
-#: sphinx/domains/javascript.py:118 sphinx/domains/python.py:285
+#: sphinx/domains/javascript.py:107 sphinx/domains/python.py:318
#, python-format
msgid "%s() (%s method)"
msgstr "%s() (Methode von %s)"
-#: sphinx/domains/javascript.py:120
+#: sphinx/domains/javascript.py:109
+#, python-format
+msgid "%s() (class)"
+msgstr "%s() (Klasse)"
+
+#: sphinx/domains/javascript.py:111
#, python-format
msgid "%s (global variable or constant)"
msgstr "%s (globale Variable oder Konstante)"
-#: sphinx/domains/javascript.py:122 sphinx/domains/python.py:323
+#: sphinx/domains/javascript.py:113 sphinx/domains/python.py:356
#, python-format
msgid "%s (%s attribute)"
msgstr "%s (Attribut von %s)"
-#: sphinx/domains/javascript.py:131
+#: sphinx/domains/javascript.py:122
msgid "Arguments"
msgstr "Parameter"
-#: sphinx/domains/javascript.py:134
+#: sphinx/domains/javascript.py:125
msgid "Throws"
msgstr "Wirft"
-#: sphinx/domains/javascript.py:167 sphinx/domains/python.py:498
+#: sphinx/domains/javascript.py:164 sphinx/domains/python.py:560
msgid "data"
msgstr "Daten"
-#: sphinx/domains/javascript.py:168 sphinx/domains/python.py:504
-#, python-format
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:566
msgid "attribute"
msgstr "Attribut"
-#: sphinx/domains/python.py:53
+#: sphinx/domains/python.py:100
msgid "Variables"
msgstr "Variablen"
-#: sphinx/domains/python.py:56
+#: sphinx/domains/python.py:104
msgid "Raises"
msgstr "Verursacht"
-#: sphinx/domains/python.py:222 sphinx/domains/python.py:279
-#: sphinx/domains/python.py:291 sphinx/domains/python.py:304
+#: sphinx/domains/python.py:255 sphinx/domains/python.py:312
+#: sphinx/domains/python.py:324 sphinx/domains/python.py:337
#, python-format
msgid "%s() (in module %s)"
msgstr "%s() (in Modul %s)"
-#: sphinx/domains/python.py:225
+#: sphinx/domains/python.py:258
#, python-format
msgid "%s (built-in variable)"
msgstr "%s (Standard-Variable)"
-#: sphinx/domains/python.py:226 sphinx/domains/python.py:317
+#: sphinx/domains/python.py:259 sphinx/domains/python.py:350
#, python-format
msgid "%s (in module %s)"
msgstr "%s (in Modul %s)"
-#: sphinx/domains/python.py:242
+#: sphinx/domains/python.py:275
#, python-format
msgid "%s (built-in class)"
msgstr "%s (Standard-Klasse)"
-#: sphinx/domains/python.py:243
+#: sphinx/domains/python.py:276
#, python-format
msgid "%s (class in %s)"
msgstr "%s (Klasse in %s)"
-#: sphinx/domains/python.py:283
+#: sphinx/domains/python.py:316
#, python-format
msgid "%s() (%s.%s method)"
msgstr "%s() (Methode von %s.%s)"
-#: sphinx/domains/python.py:295
+#: sphinx/domains/python.py:328
#, python-format
msgid "%s() (%s.%s static method)"
msgstr "%s() (statische Methode von %s.%s)"
-#: sphinx/domains/python.py:298
+#: sphinx/domains/python.py:331
#, python-format
msgid "%s() (%s static method)"
msgstr "%s() (statische Methode von %s)"
-#: sphinx/domains/python.py:308
+#: sphinx/domains/python.py:341
#, python-format
msgid "%s() (%s.%s class method)"
msgstr "%s() (Klassenmethode von %s.%s)"
-#: sphinx/domains/python.py:311
+#: sphinx/domains/python.py:344
#, python-format
msgid "%s() (%s class method)"
msgstr "%s() (Klassenmethode von %s)"
-#: sphinx/domains/python.py:321
+#: sphinx/domains/python.py:354
#, python-format
msgid "%s (%s.%s attribute)"
msgstr "%s (Attribut von %s.%s)"
-#: sphinx/domains/python.py:366
-msgid "Platforms: "
-msgstr "Plattformen: "
-
-#: sphinx/domains/python.py:372
+#: sphinx/domains/python.py:434
#, python-format
msgid "%s (module)"
msgstr "%s (Modul)"
-#: sphinx/domains/python.py:429
+#: sphinx/domains/python.py:491
msgid "Python Module Index"
msgstr "Python-Modulindex"
-#: sphinx/domains/python.py:430
+#: sphinx/domains/python.py:492
msgid "modules"
msgstr "Module"
-#: sphinx/domains/python.py:475
+#: sphinx/domains/python.py:537
msgid "Deprecated"
msgstr "Veraltet"
-#: sphinx/domains/python.py:500 sphinx/locale/__init__.py:162
+#: sphinx/domains/python.py:562 sphinx/locale/__init__.py:179
msgid "exception"
msgstr "Exception"
-#: sphinx/domains/python.py:501
+#: sphinx/domains/python.py:563
msgid "method"
msgstr "Methode"
-#: sphinx/domains/python.py:502
-#, python-format
+#: sphinx/domains/python.py:564
msgid "class method"
msgstr "Klassenmethode"
-#: sphinx/domains/python.py:503
+#: sphinx/domains/python.py:565
msgid "static method"
msgstr "statische Methode"
-#: sphinx/domains/python.py:505 sphinx/locale/__init__.py:158
+#: sphinx/domains/python.py:567 sphinx/locale/__init__.py:175
msgid "module"
msgstr "Module"
-#: sphinx/domains/rst.py:53
+#: sphinx/domains/python.py:695
+msgid " (deprecated)"
+msgstr " (veraltet)"
+
+#: sphinx/domains/rst.py:55
#, python-format
msgid "%s (directive)"
msgstr "%s (Direktive)"
-#: sphinx/domains/rst.py:55
+#: sphinx/domains/rst.py:57
#, python-format
msgid "%s (role)"
msgstr "%s (Rolle)"
-#: sphinx/domains/rst.py:103
+#: sphinx/domains/rst.py:106
msgid "directive"
msgstr "Direktive"
-#: sphinx/domains/rst.py:104
+#: sphinx/domains/rst.py:107
msgid "role"
msgstr "Rolle"
-#: sphinx/domains/std.py:68 sphinx/domains/std.py:84
+#: sphinx/domains/std.py:70 sphinx/domains/std.py:86
#, python-format
msgid "environment variable; %s"
msgstr "Umgebungsvariable; %s"
-#: sphinx/domains/std.py:160
+#: sphinx/domains/std.py:162
#, python-format
msgid "%scommand line option; %s"
msgstr "%sKommandozeilenoption; %s"
-#: sphinx/domains/std.py:328
+#: sphinx/domains/std.py:393
msgid "glossary term"
msgstr "Glossareintrag"
-#: sphinx/domains/std.py:329
+#: sphinx/domains/std.py:394
msgid "grammar token"
msgstr "Grammatik-Token"
-#: sphinx/domains/std.py:330
+#: sphinx/domains/std.py:395
msgid "reference label"
msgstr "Referenz-Label"
-#: sphinx/domains/std.py:331
-#, python-format
+#: sphinx/domains/std.py:396
msgid "environment variable"
msgstr "Umgebungsvariable"
-#: sphinx/domains/std.py:332
+#: sphinx/domains/std.py:397
msgid "program option"
msgstr "Programmoption"
-#: sphinx/domains/std.py:360 sphinx/themes/basic/genindex-single.html:11
+#: sphinx/domains/std.py:427 sphinx/themes/basic/genindex-single.html:32
#: sphinx/themes/basic/genindex-split.html:11
#: sphinx/themes/basic/genindex-split.html:14
-#: sphinx/themes/basic/genindex.html:11 sphinx/themes/basic/genindex.html:14
-#: sphinx/themes/basic/genindex.html:50 sphinx/themes/basic/layout.html:125
-#: sphinx/writers/latex.py:173
+#: sphinx/themes/basic/genindex.html:32 sphinx/themes/basic/genindex.html:35
+#: sphinx/themes/basic/genindex.html:68 sphinx/themes/basic/layout.html:134
+#: sphinx/writers/latex.py:179 sphinx/writers/texinfo.py:456
msgid "Index"
msgstr "Stichwortverzeichnis"
-#: sphinx/domains/std.py:361
+#: sphinx/domains/std.py:428
msgid "Module Index"
msgstr "Modulindex"
-#: sphinx/domains/std.py:362 sphinx/themes/basic/defindex.html:25
+#: sphinx/domains/std.py:429 sphinx/themes/basic/defindex.html:25
msgid "Search Page"
msgstr "Suche"
-#: sphinx/ext/autodoc.py:917
+#: sphinx/ext/autodoc.py:1002
#, python-format
msgid " Bases: %s"
msgstr " Basisklassen: %s"
-#: sphinx/ext/autodoc.py:950
+#: sphinx/ext/autodoc.py:1038
#, python-format
msgid "alias of :class:`%s`"
msgstr "Alias von :class:`%s`"
@@ -400,103 +418,103 @@ msgstr "(Der <<ursprüngliche Eintrag>> steht in %s, Zeile %d.)"
msgid "original entry"
msgstr "ursprüngliche Eintrag"
-#: sphinx/ext/viewcode.py:66
+#: sphinx/ext/viewcode.py:70
msgid "[source]"
msgstr "[Quelle]"
-#: sphinx/ext/viewcode.py:109
+#: sphinx/ext/viewcode.py:117
msgid "[docs]"
msgstr "[Doku]"
-#: sphinx/ext/viewcode.py:123
+#: sphinx/ext/viewcode.py:131
msgid "Module code"
msgstr "Modul-Quellcode"
-#: sphinx/ext/viewcode.py:129
+#: sphinx/ext/viewcode.py:137
#, python-format
msgid "<h1>Source code for %s</h1>"
msgstr "<h1>Quellcode für %s</h1>"
-#: sphinx/ext/viewcode.py:156
+#: sphinx/ext/viewcode.py:164
msgid "Overview: module code"
msgstr "Überblick: Modul-Quellcode"
-#: sphinx/ext/viewcode.py:157
+#: sphinx/ext/viewcode.py:165
msgid "<h1>All modules for which code is available</h1>"
msgstr "<h1>Alle Module, für die Quellcode verfügbar ist</h1>"
-#: sphinx/locale/__init__.py:139
+#: sphinx/locale/__init__.py:155
msgid "Attention"
msgstr "Achtung"
-#: sphinx/locale/__init__.py:140
+#: sphinx/locale/__init__.py:156
msgid "Caution"
msgstr "Vorsicht"
-#: sphinx/locale/__init__.py:141
+#: sphinx/locale/__init__.py:157
msgid "Danger"
msgstr "Gefahr"
-#: sphinx/locale/__init__.py:142
+#: sphinx/locale/__init__.py:158
msgid "Error"
msgstr "Fehler"
-#: sphinx/locale/__init__.py:143
+#: sphinx/locale/__init__.py:159
msgid "Hint"
msgstr "Hinweis"
-#: sphinx/locale/__init__.py:144
+#: sphinx/locale/__init__.py:160
msgid "Important"
msgstr "Wichtig"
-#: sphinx/locale/__init__.py:145
+#: sphinx/locale/__init__.py:161
msgid "Note"
msgstr "Bemerkung"
-#: sphinx/locale/__init__.py:146
+#: sphinx/locale/__init__.py:162
msgid "See Also"
msgstr "Siehe auch"
-#: sphinx/locale/__init__.py:147
+#: sphinx/locale/__init__.py:163
msgid "Tip"
msgstr "Tipp"
-#: sphinx/locale/__init__.py:148
+#: sphinx/locale/__init__.py:164
msgid "Warning"
msgstr "Warnung"
-#: sphinx/locale/__init__.py:152
+#: sphinx/locale/__init__.py:168
#, python-format
msgid "New in version %s"
msgstr "Neu in Version %s"
-#: sphinx/locale/__init__.py:153
+#: sphinx/locale/__init__.py:169
#, python-format
msgid "Changed in version %s"
msgstr "Geändert in Version %s"
-#: sphinx/locale/__init__.py:154
+#: sphinx/locale/__init__.py:170
#, python-format
msgid "Deprecated since version %s"
msgstr "Veraltet ab Version %s"
-#: sphinx/locale/__init__.py:159
+#: sphinx/locale/__init__.py:176
msgid "keyword"
msgstr "Schlüsselwort"
-#: sphinx/locale/__init__.py:160
+#: sphinx/locale/__init__.py:177
msgid "operator"
msgstr "Operator"
-#: sphinx/locale/__init__.py:161
+#: sphinx/locale/__init__.py:178
msgid "object"
msgstr "Objekt"
-#: sphinx/locale/__init__.py:163
+#: sphinx/locale/__init__.py:180
msgid "statement"
msgstr "Anweisung"
-#: sphinx/locale/__init__.py:164
+#: sphinx/locale/__init__.py:181
msgid "built-in function"
msgstr "Standard-Funktion"
@@ -505,8 +523,8 @@ msgstr "Standard-Funktion"
msgid "Table Of Contents"
msgstr "Inhalt"
-#: sphinx/themes/agogo/layout.html:49 sphinx/themes/basic/layout.html:128
-#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:14
+#: sphinx/themes/agogo/layout.html:49 sphinx/themes/basic/layout.html:137
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:20
msgid "Search"
msgstr "Suche"
@@ -556,15 +574,15 @@ msgstr "Schneller Zugriff auf alle Module"
msgid "all functions, classes, terms"
msgstr "Alle Funktionen, Klassen, Begriffe"
-#: sphinx/themes/basic/genindex-single.html:14
+#: sphinx/themes/basic/genindex-single.html:35
#, python-format
msgid "Index &ndash; %(key)s"
msgstr "Stichwortverzeichnis &ndash; %(key)s"
-#: sphinx/themes/basic/genindex-single.html:46
+#: sphinx/themes/basic/genindex-single.html:63
#: sphinx/themes/basic/genindex-split.html:24
#: sphinx/themes/basic/genindex-split.html:38
-#: sphinx/themes/basic/genindex.html:56
+#: sphinx/themes/basic/genindex.html:74
msgid "Full index on one page"
msgstr "Gesamtes Stichwortverzeichnis auf einer Seite"
@@ -576,39 +594,39 @@ msgstr "Stichwortverzeichnis nach Anfangsbuchstabe"
msgid "can be huge"
msgstr "kann groß sein"
-#: sphinx/themes/basic/layout.html:23
+#: sphinx/themes/basic/layout.html:29
msgid "Navigation"
msgstr "Navigation"
-#: sphinx/themes/basic/layout.html:113
+#: sphinx/themes/basic/layout.html:122
#, python-format
msgid "Search within %(docstitle)s"
msgstr "Suche in %(docstitle)s"
-#: sphinx/themes/basic/layout.html:122
+#: sphinx/themes/basic/layout.html:131
msgid "About these documents"
msgstr "Über diese Dokumentation"
-#: sphinx/themes/basic/layout.html:131
+#: sphinx/themes/basic/layout.html:140
msgid "Copyright"
msgstr "Copyright"
-#: sphinx/themes/basic/layout.html:180
+#: sphinx/themes/basic/layout.html:189
#, python-format
msgid "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
msgstr "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
-#: sphinx/themes/basic/layout.html:182
+#: sphinx/themes/basic/layout.html:191
#, python-format
msgid "&copy; Copyright %(copyright)s."
msgstr "&copy; Copyright %(copyright)s."
-#: sphinx/themes/basic/layout.html:186
+#: sphinx/themes/basic/layout.html:195
#, python-format
msgid "Last updated on %(last_updated)s."
msgstr "Zuletzt aktualisiert am %(last_updated)s."
-#: sphinx/themes/basic/layout.html:189
+#: sphinx/themes/basic/layout.html:198
#, python-format
msgid ""
"Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
@@ -638,13 +656,13 @@ msgstr "Nächstes Thema"
msgid "next chapter"
msgstr "nächstes Kapitel"
-#: sphinx/themes/basic/search.html:18
+#: sphinx/themes/basic/search.html:24
msgid ""
"Please activate JavaScript to enable the search\n"
" functionality."
msgstr "Bitte aktivieren Sie JavaScript, wenn Sie die Suchfunktion nutzen wollen."
-#: sphinx/themes/basic/search.html:23
+#: sphinx/themes/basic/search.html:29
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"
@@ -657,16 +675,15 @@ msgstr ""
"all diesen Worten suchen wird. Seiten, die nicht alle Worte enthalten, "
"werden nicht in der Ergebnisliste erscheinen."
-#: sphinx/themes/basic/search.html:30
+#: sphinx/themes/basic/search.html:36
msgid "search"
msgstr "suchen"
-#: sphinx/themes/basic/search.html:34
-#: sphinx/themes/basic/static/searchtools.js:489
+#: sphinx/themes/basic/search.html:40
msgid "Search Results"
msgstr "Suchergebnisse"
-#: sphinx/themes/basic/search.html:36
+#: sphinx/themes/basic/search.html:42
msgid "Your search did not match any results."
msgstr "Deine Suche ergab leider keine Treffer."
@@ -706,12 +723,12 @@ msgstr "C API-Änderungen"
msgid "Other changes"
msgstr "Andere Änderungen"
-#: sphinx/themes/basic/static/doctools.js:154 sphinx/writers/html.py:482
-#: sphinx/writers/html.py:487
+#: sphinx/themes/basic/static/doctools.js:154 sphinx/writers/html.py:504
+#: sphinx/writers/html.py:510
msgid "Permalink to this headline"
msgstr "Permalink zu dieser Überschrift"
-#: sphinx/themes/basic/static/doctools.js:160 sphinx/writers/html.py:87
+#: sphinx/themes/basic/static/doctools.js:160 sphinx/writers/html.py:92
msgid "Permalink to this definition"
msgstr "Permalink zu dieser Definition"
@@ -719,37 +736,12 @@ msgstr "Permalink zu dieser Definition"
msgid "Hide Search Matches"
msgstr "Suchergebnisse ausblenden"
-#: sphinx/themes/basic/static/searchtools.js:285
-msgid "Searching"
-msgstr "Suche..."
-
-#: sphinx/themes/basic/static/searchtools.js:290
-msgid "Preparing search..."
-msgstr "Suche wird vorbereitet..."
-
-#: sphinx/themes/basic/static/searchtools.js:364
-msgid ", in "
-msgstr ", in "
-
-#: sphinx/themes/basic/static/searchtools.js:491
-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 ""
-"Es wurden keine zutreffenden Dokumente gefunden. Haben Sie alle "
-"Suchbegriffe richtig geschrieben und genügend Kategorien ausgewählt?"
-
-#: sphinx/themes/basic/static/searchtools.js:493
-#, python-format
-msgid "Search finished, found %s page(s) matching the search query."
-msgstr "Suche beendet, %s zutreffende Seite(n) gefunden."
-
-#: sphinx/themes/default/static/sidebar.js:66
+#: sphinx/themes/default/static/sidebar.js:69
msgid "Expand sidebar"
msgstr "Sidebar ausklappen"
-#: sphinx/themes/default/static/sidebar.js:79
-#: sphinx/themes/default/static/sidebar.js:106
+#: sphinx/themes/default/static/sidebar.js:82
+#: sphinx/themes/default/static/sidebar.js:110
msgid "Collapse sidebar"
msgstr "Sidebar einklappen"
@@ -757,23 +749,24 @@ msgstr "Sidebar einklappen"
msgid "Contents"
msgstr "Inhalt"
-#: sphinx/writers/latex.py:171
+#: sphinx/writers/latex.py:177
msgid "Release"
msgstr "Release"
-#: sphinx/writers/latex.py:572 sphinx/writers/manpage.py:178
+#: sphinx/writers/latex.py:594 sphinx/writers/manpage.py:182
+#: sphinx/writers/texinfo.py:589
msgid "Footnotes"
msgstr "Fußnoten"
-#: sphinx/writers/latex.py:641
+#: sphinx/writers/latex.py:676
msgid "continued from previous page"
msgstr "Fortsetzung der vorherigen Seite"
-#: sphinx/writers/latex.py:646
+#: sphinx/writers/latex.py:681
msgid "Continued on next page"
msgstr "Fortsetzung auf der nächsten Seite"
-#: sphinx/writers/text.py:422
+#: sphinx/writers/text.py:437
msgid "[image]"
msgstr "[Bild]"
diff --git a/sphinx/locale/es/LC_MESSAGES/sphinx.js b/sphinx/locale/es/LC_MESSAGES/sphinx.js
index 098e8b5d..8ccbc0ca 100644
--- a/sphinx/locale/es/LC_MESSAGES/sphinx.js
+++ b/sphinx/locale/es/LC_MESSAGES/sphinx.js
@@ -1 +1 @@
-Documentation.addTranslations({"locale": "es", "plural_expr": "(n != 1)", "messages": {"Search Results": "Resultados de la b\u00fasqueda", "Preparing search...": "Preparando la b\u00fasqueda", "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "La b\u00fasqueda no dio ning\u00fan resultado. Por favor aseg\u00farese que escribi\u00f3 todas las palabras correctamente y que ha seleccionado suficientes categor\u00edas", "Search finished, found %s page(s) matching the search query.": "B\u00fasqueda finalizada, se han encontrado %s p\u00e1gina(s) que concuerdan con su consulta", ", in ": "", "Expand sidebar": "", "Permalink to this headline": "Enlazar permanentemente con este t\u00edtulo", "Searching": "Buscando", "Collapse sidebar": "", "Permalink to this definition": "Enlazar permanentemente con esta definici\u00f3n", "Hide Search Matches": "Coincidencias de la b\u00fasqueda"}}); \ No newline at end of file
+Documentation.addTranslations({"locale": "es", "plural_expr": "(n != 1)", "messages": {"Hide Search Matches": "Coincidencias de la b\u00fasqueda", "Permalink to this definition": "Enlazar permanentemente con esta definici\u00f3n", "Expand sidebar": "", "Permalink to this headline": "Enlazar permanentemente con este t\u00edtulo", "Collapse sidebar": ""}}); \ No newline at end of file
diff --git a/sphinx/locale/es/LC_MESSAGES/sphinx.mo b/sphinx/locale/es/LC_MESSAGES/sphinx.mo
index c1ee0bfe..87b44fe6 100644
--- a/sphinx/locale/es/LC_MESSAGES/sphinx.mo
+++ b/sphinx/locale/es/LC_MESSAGES/sphinx.mo
Binary files differ
diff --git a/sphinx/locale/es/LC_MESSAGES/sphinx.po b/sphinx/locale/es/LC_MESSAGES/sphinx.po
index a380a416..fbcba7d9 100644
--- a/sphinx/locale/es/LC_MESSAGES/sphinx.po
+++ b/sphinx/locale/es/LC_MESSAGES/sphinx.po
@@ -7,390 +7,412 @@ msgid ""
msgstr ""
"Project-Id-Version: Sphinx 0.5\n"
"Report-Msgid-Bugs-To: guillem@torroja.dmt.upm.es\n"
-"POT-Creation-Date: 2008-09-11 23:58+0200\n"
-"PO-Revision-Date: 2010-05-24 23:54+0200\n"
+"POT-Creation-Date: 2011-09-21 10:06+0200\n"
+"PO-Revision-Date: 2011-01-22 14:41+0100\n"
"Last-Translator: Guillem Borrell <guillem@torroja.dmt.upm.es>\n"
"Language-Team: es <LL@li.org>\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"
+"Generated-By: Babel 0.9.6\n"
-#: sphinx/environment.py:106 sphinx/writers/latex.py:184
-#: sphinx/writers/manpage.py:67
+#: sphinx/config.py:81
#, fuzzy, python-format
+msgid "%s %s documentation"
+msgstr "%s %s documentación"
+
+#: sphinx/environment.py:119 sphinx/writers/latex.py:190
+#: sphinx/writers/manpage.py:67 sphinx/writers/texinfo.py:203
+#, python-format
msgid "%B %d, %Y"
msgstr "%d de %B de %Y"
-#: sphinx/roles.py:174
+#: sphinx/environment.py:1625
+#, python-format
+msgid "see %s"
+msgstr "ver %s"
+
+#: sphinx/environment.py:1628
+#, python-format
+msgid "see also %s"
+msgstr "ver también %s"
+
+#: sphinx/roles.py:175
#, python-format
-msgid "Python Enhancement Proposals!PEP %s"
-msgstr "Python Enhancement Proposals!PEP %s"
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr "Python Enhancement Proposals; PEP %s"
-#: sphinx/builders/changes.py:72
+#: sphinx/builders/changes.py:73
#, fuzzy
msgid "Builtins"
msgstr "Funciones de base"
-#: sphinx/builders/changes.py:74
+#: sphinx/builders/changes.py:75
#, fuzzy
msgid "Module level"
msgstr "Módulos"
-#: sphinx/builders/html.py:266
+#: sphinx/builders/html.py:274
#, python-format
msgid "%b %d, %Y"
msgstr "%d %b, %Y"
-#: sphinx/builders/html.py:285 sphinx/themes/basic/defindex.html:30
+#: sphinx/builders/html.py:293 sphinx/themes/basic/defindex.html:30
msgid "General Index"
msgstr "Índice General"
-#: sphinx/builders/html.py:285
+#: sphinx/builders/html.py:293
msgid "index"
msgstr "índice"
-#: sphinx/builders/html.py:345
+#: sphinx/builders/html.py:353
msgid "next"
msgstr "siguiente"
-#: sphinx/builders/html.py:354
+#: sphinx/builders/html.py:362
msgid "previous"
msgstr "anterior"
-#: sphinx/builders/latex.py:151
+#: sphinx/builders/latex.py:141 sphinx/builders/texinfo.py:196
msgid " (in "
msgstr ""
-#: sphinx/directives/other.py:127
+#: sphinx/directives/other.py:136
msgid "Section author: "
msgstr "Autor de la sección: "
-#: sphinx/directives/other.py:129
+#: sphinx/directives/other.py:138
msgid "Module author: "
msgstr "Autor del módulo: "
-#: sphinx/directives/other.py:131
+#: sphinx/directives/other.py:140
#, fuzzy
msgid "Code author: "
msgstr "Autor del módulo: "
-#: sphinx/directives/other.py:133
+#: sphinx/directives/other.py:142
msgid "Author: "
msgstr "Autor:"
-#: sphinx/directives/other.py:238
+#: sphinx/directives/other.py:215
msgid "See also"
msgstr "Ver también"
-#: sphinx/domains/__init__.py:253
+#: sphinx/domains/__init__.py:244
#, python-format
msgid "%s %s"
msgstr ""
-#: sphinx/domains/c.py:51 sphinx/domains/python.py:49
+#: sphinx/domains/c.py:51 sphinx/domains/python.py:95
msgid "Parameters"
msgstr "Parámetros"
-#: sphinx/domains/c.py:54 sphinx/domains/javascript.py:137
-#: sphinx/domains/python.py:59
+#: sphinx/domains/c.py:54 sphinx/domains/javascript.py:128
+#: sphinx/domains/python.py:107
msgid "Returns"
msgstr "Devuelve"
-#: sphinx/domains/c.py:56 sphinx/domains/python.py:61
+#: sphinx/domains/c.py:56 sphinx/domains/python.py:109
#, fuzzy
msgid "Return type"
msgstr "Tipo del argumento devuelto"
-#: sphinx/domains/c.py:133
+#: sphinx/domains/c.py:141
#, python-format
msgid "%s (C function)"
msgstr "%s (función C)"
-#: sphinx/domains/c.py:135
+#: sphinx/domains/c.py:143
#, python-format
msgid "%s (C member)"
msgstr "%s (miembro C)"
-#: sphinx/domains/c.py:137
+#: sphinx/domains/c.py:145
#, python-format
msgid "%s (C macro)"
msgstr "%s (macro C)"
-#: sphinx/domains/c.py:139
+#: sphinx/domains/c.py:147
#, python-format
msgid "%s (C type)"
msgstr "%s (tipo C)"
-#: sphinx/domains/c.py:141
+#: sphinx/domains/c.py:149
#, python-format
msgid "%s (C variable)"
msgstr "%s (variable C)"
-#: sphinx/domains/c.py:171 sphinx/domains/cpp.py:1031
-#: sphinx/domains/javascript.py:166 sphinx/domains/python.py:497
+#: sphinx/domains/c.py:204 sphinx/domains/cpp.py:1060
+#: sphinx/domains/javascript.py:162 sphinx/domains/python.py:559
msgid "function"
msgstr "función"
-#: sphinx/domains/c.py:172 sphinx/domains/cpp.py:1032
+#: sphinx/domains/c.py:205 sphinx/domains/cpp.py:1061
msgid "member"
msgstr "miembro"
-#: sphinx/domains/c.py:173
+#: sphinx/domains/c.py:206
msgid "macro"
msgstr ""
-#: sphinx/domains/c.py:174 sphinx/domains/cpp.py:1033
+#: sphinx/domains/c.py:207 sphinx/domains/cpp.py:1062
msgid "type"
msgstr "tipo"
-#: sphinx/domains/c.py:175
+#: sphinx/domains/c.py:208
#, fuzzy
msgid "variable"
msgstr "Variable"
-#: sphinx/domains/cpp.py:876
+#: sphinx/domains/cpp.py:904
#, python-format
msgid "%s (C++ class)"
msgstr "%s (clase C++)"
-#: sphinx/domains/cpp.py:891
+#: sphinx/domains/cpp.py:919
#, python-format
msgid "%s (C++ type)"
msgstr "%s (tipo C++)"
-#: sphinx/domains/cpp.py:910
+#: sphinx/domains/cpp.py:938
#, fuzzy, python-format
msgid "%s (C++ member)"
msgstr "%s (miembro C++)"
-#: sphinx/domains/cpp.py:962
+#: sphinx/domains/cpp.py:990
#, fuzzy, python-format
msgid "%s (C++ function)"
msgstr "%s (función C++)"
-#: sphinx/domains/cpp.py:1030 sphinx/domains/python.py:499
+#: sphinx/domains/cpp.py:1059 sphinx/domains/javascript.py:163
+#: sphinx/domains/python.py:561
msgid "class"
msgstr "clase"
-#: sphinx/domains/javascript.py:117 sphinx/domains/python.py:221
+#: sphinx/domains/javascript.py:106 sphinx/domains/python.py:254
#, fuzzy, python-format
msgid "%s() (built-in function)"
msgstr "%s() (función de base)"
-#: sphinx/domains/javascript.py:118 sphinx/domains/python.py:285
+#: sphinx/domains/javascript.py:107 sphinx/domains/python.py:318
#, python-format
msgid "%s() (%s method)"
msgstr "%s() (%s método)"
-#: sphinx/domains/javascript.py:120
+#: sphinx/domains/javascript.py:109
+#, fuzzy, python-format
+msgid "%s() (class)"
+msgstr "%s (clase C++)"
+
+#: sphinx/domains/javascript.py:111
#, python-format
msgid "%s (global variable or constant)"
msgstr ""
-#: sphinx/domains/javascript.py:122 sphinx/domains/python.py:323
+#: sphinx/domains/javascript.py:113 sphinx/domains/python.py:356
#, python-format
msgid "%s (%s attribute)"
msgstr "%s (%s atributo)"
-#: sphinx/domains/javascript.py:131
+#: sphinx/domains/javascript.py:122
#, fuzzy
msgid "Arguments"
msgstr "Parámetros"
-#: sphinx/domains/javascript.py:134
+#: sphinx/domains/javascript.py:125
msgid "Throws"
msgstr ""
-#: sphinx/domains/javascript.py:167 sphinx/domains/python.py:498
+#: sphinx/domains/javascript.py:164 sphinx/domains/python.py:560
msgid "data"
msgstr ""
-#: sphinx/domains/javascript.py:168 sphinx/domains/python.py:504
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:566
msgid "attribute"
msgstr "atributo"
-#: sphinx/domains/python.py:53
+#: sphinx/domains/python.py:100
#, fuzzy
msgid "Variables"
msgstr "Variable"
-#: sphinx/domains/python.py:56
+#: sphinx/domains/python.py:104
msgid "Raises"
msgstr "Muestra"
-#: sphinx/domains/python.py:222 sphinx/domains/python.py:279
-#: sphinx/domains/python.py:291 sphinx/domains/python.py:304
+#: sphinx/domains/python.py:255 sphinx/domains/python.py:312
+#: sphinx/domains/python.py:324 sphinx/domains/python.py:337
#, python-format
msgid "%s() (in module %s)"
msgstr "%s() (en el módulo %s)"
-#: sphinx/domains/python.py:225
+#: sphinx/domains/python.py:258
#, fuzzy, python-format
msgid "%s (built-in variable)"
msgstr "%s (variable de base)"
-#: sphinx/domains/python.py:226 sphinx/domains/python.py:317
+#: sphinx/domains/python.py:259 sphinx/domains/python.py:350
#, python-format
msgid "%s (in module %s)"
msgstr "%s (en el módulo %s)"
-#: sphinx/domains/python.py:242
+#: sphinx/domains/python.py:275
#, fuzzy, python-format
msgid "%s (built-in class)"
msgstr "%s (variable de base)"
-#: sphinx/domains/python.py:243
+#: sphinx/domains/python.py:276
#, python-format
msgid "%s (class in %s)"
msgstr "%s (clase en %s)"
-#: sphinx/domains/python.py:283
+#: sphinx/domains/python.py:316
#, python-format
msgid "%s() (%s.%s method)"
msgstr "%s() (%s.%s método)"
-#: sphinx/domains/python.py:295
+#: sphinx/domains/python.py:328
#, python-format
msgid "%s() (%s.%s static method)"
msgstr "%s() (%s.%s método estático)"
-#: sphinx/domains/python.py:298
+#: sphinx/domains/python.py:331
#, python-format
msgid "%s() (%s static method)"
msgstr "%s() (%s método estático)"
-#: sphinx/domains/python.py:308
+#: sphinx/domains/python.py:341
#, fuzzy, python-format
msgid "%s() (%s.%s class method)"
msgstr "%s() (%s.%s método)"
-#: sphinx/domains/python.py:311
+#: sphinx/domains/python.py:344
#, fuzzy, python-format
msgid "%s() (%s class method)"
msgstr "%s() (%s método)"
-#: sphinx/domains/python.py:321
+#: sphinx/domains/python.py:354
#, python-format
msgid "%s (%s.%s attribute)"
msgstr "%s (%s.%s atributo)"
-#: sphinx/domains/python.py:366
-msgid "Platforms: "
-msgstr "Plataformas:"
-
-#: sphinx/domains/python.py:372
+#: sphinx/domains/python.py:434
#, python-format
msgid "%s (module)"
msgstr "%s (módulo)"
-#: sphinx/domains/python.py:429
+#: sphinx/domains/python.py:491
#, fuzzy
msgid "Python Module Index"
msgstr "Índice de Módulos"
-#: sphinx/domains/python.py:430
+#: sphinx/domains/python.py:492
msgid "modules"
msgstr "módulos"
-#: sphinx/domains/python.py:475
+#: sphinx/domains/python.py:537
msgid "Deprecated"
msgstr "Obsoleto"
-#: sphinx/domains/python.py:500 sphinx/locale/__init__.py:162
+#: sphinx/domains/python.py:562 sphinx/locale/__init__.py:179
msgid "exception"
msgstr "excepción"
-#: sphinx/domains/python.py:501
+#: sphinx/domains/python.py:563
msgid "method"
msgstr ""
-#: sphinx/domains/python.py:502
-#, fuzzy, python-format
+#: sphinx/domains/python.py:564
+#, fuzzy
msgid "class method"
msgstr "%s() (%s método)"
-#: sphinx/domains/python.py:503
+#: sphinx/domains/python.py:565
msgid "static method"
msgstr "método estático"
-#: sphinx/domains/python.py:505 sphinx/locale/__init__.py:158
+#: sphinx/domains/python.py:567 sphinx/locale/__init__.py:175
msgid "module"
msgstr "módulo"
-#: sphinx/domains/rst.py:53
+#: sphinx/domains/python.py:695
+#, fuzzy
+msgid " (deprecated)"
+msgstr "Obsoleto"
+
+#: sphinx/domains/rst.py:55
#, python-format
msgid "%s (directive)"
msgstr ""
-#: sphinx/domains/rst.py:55
+#: sphinx/domains/rst.py:57
#, fuzzy, python-format
msgid "%s (role)"
msgstr "%s (módulo)"
-#: sphinx/domains/rst.py:103
+#: sphinx/domains/rst.py:106
msgid "directive"
msgstr ""
-#: sphinx/domains/rst.py:104
+#: sphinx/domains/rst.py:107
#, fuzzy
msgid "role"
msgstr "módulo"
-#: sphinx/domains/std.py:68 sphinx/domains/std.py:84
+#: sphinx/domains/std.py:70 sphinx/domains/std.py:86
#, python-format
msgid "environment variable; %s"
msgstr "variables de entorno; %s"
-#: sphinx/domains/std.py:160
+#: sphinx/domains/std.py:162
#, fuzzy, python-format
msgid "%scommand line option; %s"
msgstr "%sOpciones en línea de comandos; %s"
-#: sphinx/domains/std.py:328
+#: sphinx/domains/std.py:393
msgid "glossary term"
msgstr ""
-#: sphinx/domains/std.py:329
+#: sphinx/domains/std.py:394
msgid "grammar token"
msgstr ""
-#: sphinx/domains/std.py:330
+#: sphinx/domains/std.py:395
msgid "reference label"
msgstr ""
-#: sphinx/domains/std.py:331
+#: sphinx/domains/std.py:396
msgid "environment variable"
msgstr "variables de entorno"
-#: sphinx/domains/std.py:332
+#: sphinx/domains/std.py:397
msgid "program option"
msgstr ""
-#: sphinx/domains/std.py:360 sphinx/themes/basic/genindex-single.html:11
+#: sphinx/domains/std.py:427 sphinx/themes/basic/genindex-single.html:32
#: sphinx/themes/basic/genindex-split.html:11
#: sphinx/themes/basic/genindex-split.html:14
-#: sphinx/themes/basic/genindex.html:11 sphinx/themes/basic/genindex.html:14
-#: sphinx/themes/basic/genindex.html:50 sphinx/themes/basic/layout.html:125
-#: sphinx/writers/latex.py:173
+#: sphinx/themes/basic/genindex.html:32 sphinx/themes/basic/genindex.html:35
+#: sphinx/themes/basic/genindex.html:68 sphinx/themes/basic/layout.html:134
+#: sphinx/writers/latex.py:179 sphinx/writers/texinfo.py:456
msgid "Index"
msgstr "Índice"
-#: sphinx/domains/std.py:361
+#: sphinx/domains/std.py:428
msgid "Module Index"
msgstr "Índice de Módulos"
-#: sphinx/domains/std.py:362 sphinx/themes/basic/defindex.html:25
+#: sphinx/domains/std.py:429 sphinx/themes/basic/defindex.html:25
msgid "Search Page"
msgstr "Página de Búsqueda"
-#: sphinx/ext/autodoc.py:917
+#: sphinx/ext/autodoc.py:1002
#, python-format
msgid " Bases: %s"
msgstr ""
-#: sphinx/ext/autodoc.py:950
+#: sphinx/ext/autodoc.py:1038
#, python-format
msgid "alias of :class:`%s`"
msgstr ""
@@ -408,104 +430,104 @@ msgstr ""
msgid "original entry"
msgstr ""
-#: sphinx/ext/viewcode.py:66
+#: sphinx/ext/viewcode.py:70
msgid "[source]"
msgstr ""
-#: sphinx/ext/viewcode.py:109
+#: sphinx/ext/viewcode.py:117
msgid "[docs]"
msgstr ""
-#: sphinx/ext/viewcode.py:123
+#: sphinx/ext/viewcode.py:131
#, fuzzy
msgid "Module code"
msgstr "módulo"
-#: sphinx/ext/viewcode.py:129
+#: sphinx/ext/viewcode.py:137
#, python-format
msgid "<h1>Source code for %s</h1>"
msgstr ""
-#: sphinx/ext/viewcode.py:156
+#: sphinx/ext/viewcode.py:164
msgid "Overview: module code"
msgstr ""
-#: sphinx/ext/viewcode.py:157
+#: sphinx/ext/viewcode.py:165
msgid "<h1>All modules for which code is available</h1>"
msgstr ""
-#: sphinx/locale/__init__.py:139
+#: sphinx/locale/__init__.py:155
msgid "Attention"
msgstr "Atención"
-#: sphinx/locale/__init__.py:140
+#: sphinx/locale/__init__.py:156
msgid "Caution"
msgstr "Prudencia"
-#: sphinx/locale/__init__.py:141
+#: sphinx/locale/__init__.py:157
msgid "Danger"
msgstr "Peligro"
-#: sphinx/locale/__init__.py:142
+#: sphinx/locale/__init__.py:158
msgid "Error"
msgstr "Error"
-#: sphinx/locale/__init__.py:143
+#: sphinx/locale/__init__.py:159
msgid "Hint"
msgstr "Consejo"
-#: sphinx/locale/__init__.py:144
+#: sphinx/locale/__init__.py:160
msgid "Important"
msgstr "Importante"
-#: sphinx/locale/__init__.py:145
+#: sphinx/locale/__init__.py:161
msgid "Note"
msgstr "Nota"
-#: sphinx/locale/__init__.py:146
+#: sphinx/locale/__init__.py:162
msgid "See Also"
msgstr "Ver También"
-#: sphinx/locale/__init__.py:147
+#: sphinx/locale/__init__.py:163
msgid "Tip"
msgstr "Truco"
-#: sphinx/locale/__init__.py:148
+#: sphinx/locale/__init__.py:164
msgid "Warning"
msgstr "Advertencia"
-#: sphinx/locale/__init__.py:152
+#: sphinx/locale/__init__.py:168
#, python-format
msgid "New in version %s"
msgstr "Nuevo en la versión %s"
-#: sphinx/locale/__init__.py:153
+#: sphinx/locale/__init__.py:169
#, python-format
msgid "Changed in version %s"
msgstr "Distinto en la versión %s"
-#: sphinx/locale/__init__.py:154
+#: sphinx/locale/__init__.py:170
#, python-format
msgid "Deprecated since version %s"
msgstr "Obsoleto desde la versión %s"
-#: sphinx/locale/__init__.py:159
+#: sphinx/locale/__init__.py:176
msgid "keyword"
msgstr "palabra clave"
-#: sphinx/locale/__init__.py:160
+#: sphinx/locale/__init__.py:177
msgid "operator"
msgstr "operador"
-#: sphinx/locale/__init__.py:161
+#: sphinx/locale/__init__.py:178
msgid "object"
msgstr "objeto"
-#: sphinx/locale/__init__.py:163
+#: sphinx/locale/__init__.py:180
msgid "statement"
msgstr "sentencia"
-#: sphinx/locale/__init__.py:164
+#: sphinx/locale/__init__.py:181
#, fuzzy
msgid "built-in function"
msgstr "función de base"
@@ -515,8 +537,8 @@ msgstr "función de base"
msgid "Table Of Contents"
msgstr "Contenidos"
-#: sphinx/themes/agogo/layout.html:49 sphinx/themes/basic/layout.html:128
-#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:14
+#: sphinx/themes/agogo/layout.html:49 sphinx/themes/basic/layout.html:137
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:20
msgid "Search"
msgstr "Búsqueda"
@@ -565,15 +587,15 @@ msgstr "acceso rápido a todos los módulos"
msgid "all functions, classes, terms"
msgstr "todas las funciones, clases, términos"
-#: sphinx/themes/basic/genindex-single.html:14
+#: sphinx/themes/basic/genindex-single.html:35
#, python-format
msgid "Index &ndash; %(key)s"
msgstr "Índice &ndash; %(key)s"
-#: sphinx/themes/basic/genindex-single.html:46
+#: sphinx/themes/basic/genindex-single.html:63
#: sphinx/themes/basic/genindex-split.html:24
#: sphinx/themes/basic/genindex-split.html:38
-#: sphinx/themes/basic/genindex.html:56
+#: sphinx/themes/basic/genindex.html:74
msgid "Full index on one page"
msgstr "Índice completo en una página"
@@ -585,39 +607,39 @@ msgstr "Índice alfabético"
msgid "can be huge"
msgstr "puede ser muy grande"
-#: sphinx/themes/basic/layout.html:23
+#: sphinx/themes/basic/layout.html:29
msgid "Navigation"
msgstr "Navegación"
-#: sphinx/themes/basic/layout.html:113
+#: sphinx/themes/basic/layout.html:122
#, python-format
msgid "Search within %(docstitle)s"
msgstr "Buscar en %(docstitle)s"
-#: sphinx/themes/basic/layout.html:122
+#: sphinx/themes/basic/layout.html:131
msgid "About these documents"
msgstr "Sobre este documento"
-#: sphinx/themes/basic/layout.html:131
+#: sphinx/themes/basic/layout.html:140
msgid "Copyright"
msgstr "Copyright"
-#: sphinx/themes/basic/layout.html:180
+#: sphinx/themes/basic/layout.html:189
#, python-format
msgid "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
msgstr "&copy; <a href=\\\"%(path)s\\\">Copyright</a> %(copyright)s."
-#: sphinx/themes/basic/layout.html:182
+#: sphinx/themes/basic/layout.html:191
#, python-format
msgid "&copy; Copyright %(copyright)s."
msgstr "&copy; Copyright %(copyright)s."
-#: sphinx/themes/basic/layout.html:186
+#: sphinx/themes/basic/layout.html:195
#, python-format
msgid "Last updated on %(last_updated)s."
msgstr "Actualizado por última vez en %(last_updated)s."
-#: sphinx/themes/basic/layout.html:189
+#: sphinx/themes/basic/layout.html:198
#, python-format
msgid ""
"Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
@@ -647,13 +669,13 @@ msgstr "Próximo tema"
msgid "next chapter"
msgstr "Próximo capítulo"
-#: sphinx/themes/basic/search.html:18
+#: sphinx/themes/basic/search.html:24
msgid ""
"Please activate JavaScript to enable the search\n"
" functionality."
msgstr ""
-#: sphinx/themes/basic/search.html:23
+#: sphinx/themes/basic/search.html:29
#, fuzzy
msgid ""
"From here you can search these documents. Enter your search\n"
@@ -666,16 +688,15 @@ msgstr ""
" las palabras. Las páginas que contengan menos palabras no aparecerán en"
" la lista de resultados."
-#: sphinx/themes/basic/search.html:30
+#: sphinx/themes/basic/search.html:36
msgid "search"
msgstr "buscar"
-#: sphinx/themes/basic/search.html:34
-#: sphinx/themes/basic/static/searchtools.js:489
+#: sphinx/themes/basic/search.html:40
msgid "Search Results"
msgstr "Resultados de la búsqueda"
-#: sphinx/themes/basic/search.html:36
+#: sphinx/themes/basic/search.html:42
msgid "Your search did not match any results."
msgstr "Tu consulta no obtuvo ningún resultado"
@@ -715,12 +736,12 @@ msgstr "Cambios en la API C"
msgid "Other changes"
msgstr "Otros cambios"
-#: sphinx/themes/basic/static/doctools.js:154 sphinx/writers/html.py:482
-#: sphinx/writers/html.py:487
+#: sphinx/themes/basic/static/doctools.js:154 sphinx/writers/html.py:504
+#: sphinx/writers/html.py:510
msgid "Permalink to this headline"
msgstr "Enlazar permanentemente con este título"
-#: sphinx/themes/basic/static/doctools.js:160 sphinx/writers/html.py:87
+#: sphinx/themes/basic/static/doctools.js:160 sphinx/writers/html.py:92
msgid "Permalink to this definition"
msgstr "Enlazar permanentemente con esta definición"
@@ -729,40 +750,12 @@ msgstr "Enlazar permanentemente con esta definición"
msgid "Hide Search Matches"
msgstr "Coincidencias de la búsqueda"
-#: sphinx/themes/basic/static/searchtools.js:285
-msgid "Searching"
-msgstr "Buscando"
-
-#: sphinx/themes/basic/static/searchtools.js:290
-msgid "Preparing search..."
-msgstr "Preparando la búsqueda"
-
-#: sphinx/themes/basic/static/searchtools.js:364
-msgid ", in "
-msgstr ""
-
-#: sphinx/themes/basic/static/searchtools.js:491
-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 ""
-"La búsqueda no dio ningún resultado. Por favor asegúrese que escribió "
-"todas las palabras correctamente y que ha seleccionado suficientes "
-"categorías"
-
-#: sphinx/themes/basic/static/searchtools.js:493
-#, python-format
-msgid "Search finished, found %s page(s) matching the search query."
-msgstr ""
-"Búsqueda finalizada, se han encontrado %s página(s) que concuerdan con su"
-" consulta"
-
-#: sphinx/themes/default/static/sidebar.js:66
+#: sphinx/themes/default/static/sidebar.js:69
msgid "Expand sidebar"
msgstr ""
-#: sphinx/themes/default/static/sidebar.js:79
-#: sphinx/themes/default/static/sidebar.js:106
+#: sphinx/themes/default/static/sidebar.js:82
+#: sphinx/themes/default/static/sidebar.js:110
msgid "Collapse sidebar"
msgstr ""
@@ -770,24 +763,26 @@ msgstr ""
msgid "Contents"
msgstr ""
-#: sphinx/writers/latex.py:171
+#: sphinx/writers/latex.py:177
#, fuzzy
msgid "Release"
msgstr "Versión"
-#: sphinx/writers/latex.py:572 sphinx/writers/manpage.py:178
+#: sphinx/writers/latex.py:594 sphinx/writers/manpage.py:182
+#: sphinx/writers/texinfo.py:589
msgid "Footnotes"
msgstr ""
-#: sphinx/writers/latex.py:641
+#: sphinx/writers/latex.py:676
msgid "continued from previous page"
msgstr ""
-#: sphinx/writers/latex.py:646
+#: sphinx/writers/latex.py:681
#, fuzzy
msgid "Continued on next page"
msgstr "Índice completo en una página"
-#: sphinx/writers/text.py:422
+#: sphinx/writers/text.py:437
msgid "[image]"
msgstr "[imagen]"
+
diff --git a/sphinx/locale/et/LC_MESSAGES/sphinx.js b/sphinx/locale/et/LC_MESSAGES/sphinx.js
new file mode 100644
index 00000000..5f51a53a
--- /dev/null
+++ b/sphinx/locale/et/LC_MESSAGES/sphinx.js
@@ -0,0 +1 @@
+Documentation.addTranslations({"locale": "et", "plural_expr": "(n != 1)", "messages": {"Hide Search Matches": "Varja otsingutulemused", "Permalink to this definition": "P\u00fcsilink sellele definitsioonile", "Expand sidebar": "N\u00e4ita k\u00fclgriba", "Permalink to this headline": "P\u00fcsilink sellele pealkirjale", "Collapse sidebar": "Varja k\u00fclgriba"}}); \ No newline at end of file
diff --git a/sphinx/locale/et/LC_MESSAGES/sphinx.mo b/sphinx/locale/et/LC_MESSAGES/sphinx.mo
new file mode 100644
index 00000000..14b911c0
--- /dev/null
+++ b/sphinx/locale/et/LC_MESSAGES/sphinx.mo
Binary files differ
diff --git a/sphinx/locale/et/LC_MESSAGES/sphinx.po b/sphinx/locale/et/LC_MESSAGES/sphinx.po
new file mode 100644
index 00000000..a687f297
--- /dev/null
+++ b/sphinx/locale/et/LC_MESSAGES/sphinx.po
@@ -0,0 +1,770 @@
+# Estonian translations for Sphinx.
+# Copyright (C) 2010 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2010.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx 1.0pre/8b971dbc7d36\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2011-09-21 10:06+0200\n"
+"PO-Revision-Date: 2011-09-18 11:40+0200\n"
+"Last-Translator: Aivar Annamaa <aivar.annamaa@gmail.com>\n"
+"Language-Team: \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.6\n"
+
+#: sphinx/config.py:81
+#, fuzzy, python-format
+msgid "%s %s documentation"
+msgstr "%s %s dokumentatsioon"
+
+#: sphinx/environment.py:119 sphinx/writers/latex.py:190
+#: sphinx/writers/manpage.py:67 sphinx/writers/texinfo.py:203
+#, python-format
+msgid "%B %d, %Y"
+msgstr "%B %d, %Y"
+
+#: sphinx/environment.py:1625
+#, python-format
+msgid "see %s"
+msgstr ""
+
+#: sphinx/environment.py:1628
+#, python-format
+msgid "see also %s"
+msgstr ""
+
+#: sphinx/roles.py:175
+#, fuzzy, python-format
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr "Python Enhancement Proposals!PEP %s"
+
+#: sphinx/builders/changes.py:73
+msgid "Builtins"
+msgstr "Sisseehitatud"
+
+#: sphinx/builders/changes.py:75
+msgid "Module level"
+msgstr "Mooduli tase"
+
+#: sphinx/builders/html.py:274
+#, python-format
+msgid "%b %d, %Y"
+msgstr "%b %d, %Y"
+
+#: sphinx/builders/html.py:293 sphinx/themes/basic/defindex.html:30
+msgid "General Index"
+msgstr "Üldindeks"
+
+#: sphinx/builders/html.py:293
+msgid "index"
+msgstr "indeks"
+
+#: sphinx/builders/html.py:353
+msgid "next"
+msgstr "järgmine"
+
+#: sphinx/builders/html.py:362
+msgid "previous"
+msgstr "eelmine"
+
+#: sphinx/builders/latex.py:141 sphinx/builders/texinfo.py:196
+msgid " (in "
+msgstr " (in "
+
+#: sphinx/directives/other.py:136
+msgid "Section author: "
+msgstr "Sektsiooni autor:"
+
+#: sphinx/directives/other.py:138
+msgid "Module author: "
+msgstr "Mooduli autor:"
+
+#: sphinx/directives/other.py:140
+msgid "Code author: "
+msgstr "Koodi autor:"
+
+#: sphinx/directives/other.py:142
+msgid "Author: "
+msgstr "Autor: "
+
+#: sphinx/directives/other.py:215
+msgid "See also"
+msgstr "Vaata ka"
+
+#: sphinx/domains/__init__.py:244
+#, python-format
+msgid "%s %s"
+msgstr "%s %s"
+
+#: sphinx/domains/c.py:51 sphinx/domains/python.py:95
+msgid "Parameters"
+msgstr "Parameetrid"
+
+#: sphinx/domains/c.py:54 sphinx/domains/javascript.py:128
+#: sphinx/domains/python.py:107
+msgid "Returns"
+msgstr "Tagastab"
+
+#: sphinx/domains/c.py:56 sphinx/domains/python.py:109
+msgid "Return type"
+msgstr "Tagastustüüp"
+
+#: sphinx/domains/c.py:141
+#, python-format
+msgid "%s (C function)"
+msgstr "%s (C funktsioon)"
+
+#: sphinx/domains/c.py:143
+#, python-format
+msgid "%s (C member)"
+msgstr "%s (C liige)"
+
+#: sphinx/domains/c.py:145
+#, python-format
+msgid "%s (C macro)"
+msgstr "%s (C makro)"
+
+#: sphinx/domains/c.py:147
+#, python-format
+msgid "%s (C type)"
+msgstr "%s (C tüüp)"
+
+#: sphinx/domains/c.py:149
+#, python-format
+msgid "%s (C variable)"
+msgstr "%s (C muutuja)"
+
+#: sphinx/domains/c.py:204 sphinx/domains/cpp.py:1060
+#: sphinx/domains/javascript.py:162 sphinx/domains/python.py:559
+msgid "function"
+msgstr "funktsioon"
+
+#: sphinx/domains/c.py:205 sphinx/domains/cpp.py:1061
+msgid "member"
+msgstr "liige"
+
+#: sphinx/domains/c.py:206
+msgid "macro"
+msgstr "makro"
+
+#: sphinx/domains/c.py:207 sphinx/domains/cpp.py:1062
+msgid "type"
+msgstr "tüüp"
+
+#: sphinx/domains/c.py:208
+msgid "variable"
+msgstr "muutuja"
+
+#: sphinx/domains/cpp.py:904
+#, python-format
+msgid "%s (C++ class)"
+msgstr "%s (C++ klass)"
+
+#: sphinx/domains/cpp.py:919
+#, python-format
+msgid "%s (C++ type)"
+msgstr "%s (C++ tüüp)"
+
+#: sphinx/domains/cpp.py:938
+#, python-format
+msgid "%s (C++ member)"
+msgstr "%s (C++ liige)"
+
+#: sphinx/domains/cpp.py:990
+#, python-format
+msgid "%s (C++ function)"
+msgstr "%s (C++ funktsioon)"
+
+#: sphinx/domains/cpp.py:1059 sphinx/domains/javascript.py:163
+#: sphinx/domains/python.py:561
+msgid "class"
+msgstr "klass"
+
+#: sphinx/domains/javascript.py:106 sphinx/domains/python.py:254
+#, python-format
+msgid "%s() (built-in function)"
+msgstr "%s() (sisseehitatud funktsioon)"
+
+#: sphinx/domains/javascript.py:107 sphinx/domains/python.py:318
+#, python-format
+msgid "%s() (%s method)"
+msgstr "%s() (%s meetod)"
+
+#: sphinx/domains/javascript.py:109
+#, fuzzy, python-format
+msgid "%s() (class)"
+msgstr "%s (C++ klass)"
+
+#: sphinx/domains/javascript.py:111
+#, python-format
+msgid "%s (global variable or constant)"
+msgstr "%s (globaalmuutuja või konstant)"
+
+#: sphinx/domains/javascript.py:113 sphinx/domains/python.py:356
+#, python-format
+msgid "%s (%s attribute)"
+msgstr "%s (%s atribuut)"
+
+#: sphinx/domains/javascript.py:122
+msgid "Arguments"
+msgstr "Argumendid"
+
+#: sphinx/domains/javascript.py:125
+msgid "Throws"
+msgstr "Throws"
+
+#: sphinx/domains/javascript.py:164 sphinx/domains/python.py:560
+msgid "data"
+msgstr "andmed"
+
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:566
+msgid "attribute"
+msgstr "atribuut"
+
+#: sphinx/domains/python.py:100
+msgid "Variables"
+msgstr "Muutujad"
+
+#: sphinx/domains/python.py:104
+msgid "Raises"
+msgstr "Raises"
+
+#: sphinx/domains/python.py:255 sphinx/domains/python.py:312
+#: sphinx/domains/python.py:324 sphinx/domains/python.py:337
+#, python-format
+msgid "%s() (in module %s)"
+msgstr "%s() (moodulis %s)"
+
+#: sphinx/domains/python.py:258
+#, python-format
+msgid "%s (built-in variable)"
+msgstr "%s (sisseehitatud muutuja)"
+
+#: sphinx/domains/python.py:259 sphinx/domains/python.py:350
+#, python-format
+msgid "%s (in module %s)"
+msgstr "%s (moodulis %s)"
+
+#: sphinx/domains/python.py:275
+#, python-format
+msgid "%s (built-in class)"
+msgstr "%s (sisseehitatud klass)"
+
+#: sphinx/domains/python.py:276
+#, python-format
+msgid "%s (class in %s)"
+msgstr "%s (klass moodulis %s)"
+
+#: sphinx/domains/python.py:316
+#, python-format
+msgid "%s() (%s.%s method)"
+msgstr "%s() (%s.%s meetod)"
+
+#: sphinx/domains/python.py:328
+#, python-format
+msgid "%s() (%s.%s static method)"
+msgstr "%s() (%s.%s staatiline meetod)"
+
+#: sphinx/domains/python.py:331
+#, python-format
+msgid "%s() (%s static method)"
+msgstr "%s() (%s staatiline meetod)"
+
+#: sphinx/domains/python.py:341
+#, python-format
+msgid "%s() (%s.%s class method)"
+msgstr "%s() (%s.%s klassi meetod)"
+
+#: sphinx/domains/python.py:344
+#, python-format
+msgid "%s() (%s class method)"
+msgstr "%s() (%s klassi meetod)"
+
+#: sphinx/domains/python.py:354
+#, python-format
+msgid "%s (%s.%s attribute)"
+msgstr "%s (%s.%s atribuut)"
+
+#: sphinx/domains/python.py:434
+#, python-format
+msgid "%s (module)"
+msgstr "%s (moodul)"
+
+#: sphinx/domains/python.py:491
+msgid "Python Module Index"
+msgstr "Pythoni moodulite indeks"
+
+#: sphinx/domains/python.py:492
+msgid "modules"
+msgstr "moodulid"
+
+#: sphinx/domains/python.py:537
+msgid "Deprecated"
+msgstr "Ebaasoovitav"
+
+#: sphinx/domains/python.py:562 sphinx/locale/__init__.py:179
+msgid "exception"
+msgstr "erind"
+
+#: sphinx/domains/python.py:563
+msgid "method"
+msgstr "meetod"
+
+#: sphinx/domains/python.py:564
+msgid "class method"
+msgstr "klassi meetod"
+
+#: sphinx/domains/python.py:565
+msgid "static method"
+msgstr "staatiline meetod"
+
+#: sphinx/domains/python.py:567 sphinx/locale/__init__.py:175
+msgid "module"
+msgstr "moodul"
+
+#: sphinx/domains/python.py:695
+#, fuzzy
+msgid " (deprecated)"
+msgstr "Ebaasoovitav"
+
+#: sphinx/domains/rst.py:55
+#, python-format
+msgid "%s (directive)"
+msgstr "%s (direktiiv)"
+
+#: sphinx/domains/rst.py:57
+#, python-format
+msgid "%s (role)"
+msgstr "%s (roll)"
+
+#: sphinx/domains/rst.py:106
+msgid "directive"
+msgstr "direktiiv"
+
+#: sphinx/domains/rst.py:107
+msgid "role"
+msgstr "roll"
+
+#: sphinx/domains/std.py:70 sphinx/domains/std.py:86
+#, python-format
+msgid "environment variable; %s"
+msgstr "keskkonnamuutuja; %s"
+
+#: sphinx/domains/std.py:162
+#, python-format
+msgid "%scommand line option; %s"
+msgstr "%s käsurea valik; %s"
+
+#: sphinx/domains/std.py:393
+msgid "glossary term"
+msgstr "termin"
+
+#: sphinx/domains/std.py:394
+msgid "grammar token"
+msgstr "grammatika märgend"
+
+#: sphinx/domains/std.py:395
+msgid "reference label"
+msgstr "viite pealkiri"
+
+#: sphinx/domains/std.py:396
+msgid "environment variable"
+msgstr "keskkonnamuutuja"
+
+#: sphinx/domains/std.py:397
+msgid "program option"
+msgstr "programmi seade"
+
+#: sphinx/domains/std.py:427 sphinx/themes/basic/genindex-single.html:32
+#: sphinx/themes/basic/genindex-split.html:11
+#: sphinx/themes/basic/genindex-split.html:14
+#: sphinx/themes/basic/genindex.html:32 sphinx/themes/basic/genindex.html:35
+#: sphinx/themes/basic/genindex.html:68 sphinx/themes/basic/layout.html:134
+#: sphinx/writers/latex.py:179 sphinx/writers/texinfo.py:456
+msgid "Index"
+msgstr "Indeks"
+
+#: sphinx/domains/std.py:428
+msgid "Module Index"
+msgstr "Mooduli indeks"
+
+#: sphinx/domains/std.py:429 sphinx/themes/basic/defindex.html:25
+msgid "Search Page"
+msgstr "Otsingu lehekülg"
+
+#: sphinx/ext/autodoc.py:1002
+#, python-format
+msgid " Bases: %s"
+msgstr " Baasid: %s"
+
+#: sphinx/ext/autodoc.py:1038
+#, python-format
+msgid "alias of :class:`%s`"
+msgstr "sünonüüm :class:`%s`"
+
+#: sphinx/ext/todo.py:41
+msgid "Todo"
+msgstr "Tegemata"
+
+#: sphinx/ext/todo.py:109
+#, python-format
+msgid "(The <<original entry>> is located in %s, line %d.)"
+msgstr "(Algne kirje asub failis %s, real %d.)"
+
+#: sphinx/ext/todo.py:117
+msgid "original entry"
+msgstr "algne kirje"
+
+#: sphinx/ext/viewcode.py:70
+msgid "[source]"
+msgstr "[lähtekood]"
+
+#: sphinx/ext/viewcode.py:117
+msgid "[docs]"
+msgstr "[dokumentatsioon]"
+
+#: sphinx/ext/viewcode.py:131
+msgid "Module code"
+msgstr "Mooduli kood"
+
+#: sphinx/ext/viewcode.py:137
+#, python-format
+msgid "<h1>Source code for %s</h1>"
+msgstr "<h1>%s lähtekood</h1>"
+
+#: sphinx/ext/viewcode.py:164
+msgid "Overview: module code"
+msgstr "Ülevaade: mooduli kood"
+
+#: sphinx/ext/viewcode.py:165
+msgid "<h1>All modules for which code is available</h1>"
+msgstr "<h1>Kõik lähtekoodiga moodulid</h1>"
+
+#: sphinx/locale/__init__.py:155
+msgid "Attention"
+msgstr "Tähelepanu"
+
+#: sphinx/locale/__init__.py:156
+msgid "Caution"
+msgstr "Ettevaatust"
+
+#: sphinx/locale/__init__.py:157
+msgid "Danger"
+msgstr "Oht"
+
+#: sphinx/locale/__init__.py:158
+msgid "Error"
+msgstr "Viga"
+
+#: sphinx/locale/__init__.py:159
+msgid "Hint"
+msgstr "Vihje"
+
+#: sphinx/locale/__init__.py:160
+msgid "Important"
+msgstr "Tähtis"
+
+#: sphinx/locale/__init__.py:161
+msgid "Note"
+msgstr "Märkus"
+
+#: sphinx/locale/__init__.py:162
+msgid "See Also"
+msgstr "Vaata ka"
+
+#: sphinx/locale/__init__.py:163
+msgid "Tip"
+msgstr "Nõuanne"
+
+#: sphinx/locale/__init__.py:164
+msgid "Warning"
+msgstr "Hoiatus"
+
+#: sphinx/locale/__init__.py:168
+#, python-format
+msgid "New in version %s"
+msgstr "Uus versioonis %s"
+
+#: sphinx/locale/__init__.py:169
+#, python-format
+msgid "Changed in version %s"
+msgstr "Muudetud versioonis %s"
+
+#: sphinx/locale/__init__.py:170
+#, python-format
+msgid "Deprecated since version %s"
+msgstr "Ebasoovitav alates versioonist %s"
+
+#: sphinx/locale/__init__.py:176
+msgid "keyword"
+msgstr "võtmesõna"
+
+#: sphinx/locale/__init__.py:177
+msgid "operator"
+msgstr "operaator"
+
+#: sphinx/locale/__init__.py:178
+msgid "object"
+msgstr "objekt"
+
+#: sphinx/locale/__init__.py:180
+msgid "statement"
+msgstr "lause"
+
+#: sphinx/locale/__init__.py:181
+msgid "built-in function"
+msgstr "sisseehitatud funktsioon"
+
+#: sphinx/themes/agogo/layout.html:45 sphinx/themes/basic/globaltoc.html:10
+#: sphinx/themes/basic/localtoc.html:11
+msgid "Table Of Contents"
+msgstr "Sisukord"
+
+#: sphinx/themes/agogo/layout.html:49 sphinx/themes/basic/layout.html:137
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:20
+msgid "Search"
+msgstr "Otsing"
+
+#: sphinx/themes/agogo/layout.html:52 sphinx/themes/basic/searchbox.html:15
+msgid "Go"
+msgstr "Otsi"
+
+#: sphinx/themes/agogo/layout.html:57 sphinx/themes/basic/searchbox.html:20
+msgid "Enter search terms or a module, class or function name."
+msgstr "Sisesta otsingusõna"
+
+#: sphinx/themes/agogo/layout.html:78 sphinx/themes/basic/sourcelink.html:14
+msgid "Show Source"
+msgstr "Näita lähtekoodi"
+
+#: sphinx/themes/basic/defindex.html:11
+msgid "Overview"
+msgstr "Ülevaade"
+
+#: sphinx/themes/basic/defindex.html:20
+msgid "Indices and tables:"
+msgstr "Indeksid ja tabelid"
+
+#: sphinx/themes/basic/defindex.html:23
+msgid "Complete Table of Contents"
+msgstr "Täielik sisukord"
+
+#: sphinx/themes/basic/defindex.html:24
+msgid "lists all sections and subsections"
+msgstr "toob välja kõiks sektsioonid ja alamsektsioonid"
+
+#: sphinx/themes/basic/defindex.html:26
+msgid "search this documentation"
+msgstr "otsi sellest dokumentatsioonist"
+
+#: sphinx/themes/basic/defindex.html:28
+msgid "Global Module Index"
+msgstr "Globaalne moodulite indeks"
+
+#: sphinx/themes/basic/defindex.html:29
+msgid "quick access to all modules"
+msgstr "kiire ligipääs kõigile moodulitele"
+
+#: sphinx/themes/basic/defindex.html:31
+msgid "all functions, classes, terms"
+msgstr "kõik funktsioonid, klassid ja terminid"
+
+#: sphinx/themes/basic/genindex-single.html:35
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr "Indeks &ndash; %(key)s"
+
+#: sphinx/themes/basic/genindex-single.html:63
+#: sphinx/themes/basic/genindex-split.html:24
+#: sphinx/themes/basic/genindex-split.html:38
+#: sphinx/themes/basic/genindex.html:74
+msgid "Full index on one page"
+msgstr "Täisindeks ühel lehel"
+
+#: sphinx/themes/basic/genindex-split.html:16
+msgid "Index pages by letter"
+msgstr "Indeksi leheküljed algustähe kaupa"
+
+#: sphinx/themes/basic/genindex-split.html:25
+msgid "can be huge"
+msgstr "võib olla väga suur"
+
+#: sphinx/themes/basic/layout.html:29
+msgid "Navigation"
+msgstr "Navigatsioon"
+
+#: sphinx/themes/basic/layout.html:122
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr "Otsi %(docstitle)s piires"
+
+#: sphinx/themes/basic/layout.html:131
+msgid "About these documents"
+msgstr "Info selle dokumentatsiooni kohta"
+
+#: sphinx/themes/basic/layout.html:140
+msgid "Copyright"
+msgstr "Copyright"
+
+#: sphinx/themes/basic/layout.html:189
+#, python-format
+msgid "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
+msgstr "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
+
+#: sphinx/themes/basic/layout.html:191
+#, python-format
+msgid "&copy; Copyright %(copyright)s."
+msgstr "&copy; Copyright %(copyright)s."
+
+#: sphinx/themes/basic/layout.html:195
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr "Viimati uuendatud %(last_updated)s."
+
+#: sphinx/themes/basic/layout.html:198
+#, python-format
+msgid ""
+"Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+"Loodud <a href=\"http://sphinx.pocoo.org/\">Sphinx-iga</a> (versioon: "
+"%(sphinx_version)s)."
+
+#: sphinx/themes/basic/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr "Otsi %(docstitle)s"
+
+#: sphinx/themes/basic/relations.html:11
+msgid "Previous topic"
+msgstr "Eelmine teema"
+
+#: sphinx/themes/basic/relations.html:13
+msgid "previous chapter"
+msgstr "eelmine peatükk"
+
+#: sphinx/themes/basic/relations.html:16
+msgid "Next topic"
+msgstr "Järgmine teema"
+
+#: sphinx/themes/basic/relations.html:18
+msgid "next chapter"
+msgstr "järgmine peatükk"
+
+#: sphinx/themes/basic/search.html:24
+msgid ""
+"Please activate JavaScript to enable the search\n"
+" functionality."
+msgstr "Otsingu võimaldamiseks tuleb aktiveerida JavaScript."
+
+#: sphinx/themes/basic/search.html:29
+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 ""
+"Siin saad otsida käesolevast dokumentatsioonist. Sisesta otsisõned "
+"allolevasse lahtrisse ning klõpsa \"Otsi\". Tulemuseks antakse "
+"leheküljed, mis sisaldavad kõiki otsisõnesid."
+
+#: sphinx/themes/basic/search.html:36
+msgid "search"
+msgstr "otsi"
+
+#: sphinx/themes/basic/search.html:40
+msgid "Search Results"
+msgstr "Otsingutulemused"
+
+#: sphinx/themes/basic/search.html:42
+msgid "Your search did not match any results."
+msgstr "Otsing ei andnud tulemusi"
+
+#: sphinx/themes/basic/searchbox.html:12
+msgid "Quick search"
+msgstr "Kiirotsing"
+
+#: sphinx/themes/basic/sourcelink.html:11
+msgid "This Page"
+msgstr "Käesolev lehekülg"
+
+#: sphinx/themes/basic/changes/frameset.html:5
+#: sphinx/themes/basic/changes/versionchanges.html:12
+#, python-format
+msgid "Changes in Version %(version)s &mdash; %(docstitle)s"
+msgstr "Muudatused versioonis %(version)s &mdash; %(docstitle)s"
+
+#: sphinx/themes/basic/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &mdash; %(docstitle)s"
+msgstr "%(filename)s &mdash; %(docstitle)s"
+
+#: sphinx/themes/basic/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr "Automaatselt genereeritud nimekiri versiooni %(version)s muudatustest"
+
+#: sphinx/themes/basic/changes/versionchanges.html:18
+msgid "Library changes"
+msgstr "Teegi muudatused"
+
+#: sphinx/themes/basic/changes/versionchanges.html:23
+msgid "C API changes"
+msgstr "C API muudatused"
+
+#: sphinx/themes/basic/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr "Ülejäänud muudatused"
+
+#: sphinx/themes/basic/static/doctools.js:154 sphinx/writers/html.py:504
+#: sphinx/writers/html.py:510
+msgid "Permalink to this headline"
+msgstr "Püsilink sellele pealkirjale"
+
+#: sphinx/themes/basic/static/doctools.js:160 sphinx/writers/html.py:92
+msgid "Permalink to this definition"
+msgstr "Püsilink sellele definitsioonile"
+
+#: sphinx/themes/basic/static/doctools.js:189
+msgid "Hide Search Matches"
+msgstr "Varja otsingutulemused"
+
+#: sphinx/themes/default/static/sidebar.js:69
+msgid "Expand sidebar"
+msgstr "Näita külgriba"
+
+#: sphinx/themes/default/static/sidebar.js:82
+#: sphinx/themes/default/static/sidebar.js:110
+msgid "Collapse sidebar"
+msgstr "Varja külgriba"
+
+#: sphinx/themes/haiku/layout.html:26
+msgid "Contents"
+msgstr "Sisukord"
+
+#: sphinx/writers/latex.py:177
+msgid "Release"
+msgstr "Väljalase"
+
+#: sphinx/writers/latex.py:594 sphinx/writers/manpage.py:182
+#: sphinx/writers/texinfo.py:589
+msgid "Footnotes"
+msgstr "Joonealused märkused"
+
+#: sphinx/writers/latex.py:676
+msgid "continued from previous page"
+msgstr "jätk eelmisele leheküljele"
+
+#: sphinx/writers/latex.py:681
+msgid "Continued on next page"
+msgstr "Jätkub järgmisel lehel"
+
+#: sphinx/writers/text.py:437
+msgid "[image]"
+msgstr "[pilt]"
+
diff --git a/sphinx/locale/fa/LC_MESSAGES/sphinx.js b/sphinx/locale/fa/LC_MESSAGES/sphinx.js
new file mode 100644
index 00000000..72b0ee94
--- /dev/null
+++ b/sphinx/locale/fa/LC_MESSAGES/sphinx.js
@@ -0,0 +1 @@
+Documentation.addTranslations({"locale": "fa", "plural_expr": "(n > 1)", "messages": {"Hide Search Matches": "\u0639\u062f\u0645 \u0646\u0645\u0627\u06cc\u0634 \u0646\u062a\u0627\u06cc\u062c \u06cc\u0627\u0641\u062a \u0634\u062f\u0647", "Permalink to this definition": "\u0644\u06cc\u0646\u06a9 \u062b\u0627\u0628\u062a \u0628\u0647 \u0627\u06cc\u0646 \u062a\u0639\u0631\u06cc\u0641", "Expand sidebar": "", "Permalink to this headline": "\u0644\u06cc\u0646\u06a9 \u062b\u0627\u0628\u062a \u0628\u0647 \u0627\u06cc\u0646 \u0633\u0631 \u0645\u0642\u0627\u0644\u0647", "Collapse sidebar": ""}}); \ No newline at end of file
diff --git a/sphinx/locale/fa/LC_MESSAGES/sphinx.mo b/sphinx/locale/fa/LC_MESSAGES/sphinx.mo
new file mode 100644
index 00000000..fe705e76
--- /dev/null
+++ b/sphinx/locale/fa/LC_MESSAGES/sphinx.mo
Binary files differ
diff --git a/sphinx/locale/fa/LC_MESSAGES/sphinx.po b/sphinx/locale/fa/LC_MESSAGES/sphinx.po
new file mode 100644
index 00000000..92caf31a
--- /dev/null
+++ b/sphinx/locale/fa/LC_MESSAGES/sphinx.po
@@ -0,0 +1,779 @@
+
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx 1.0.3\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2011-09-21 10:06+0200\n"
+"PO-Revision-Date: 2011-01-22 14:41+0100\n"
+"Last-Translator: Omid Raha <omidraha.com@gmail.com>\n"
+"Language-Team: Omid Raha <omidraha.com@gmail.com>\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.6\n"
+
+#: sphinx/config.py:81
+#, python-format
+msgid "%s %s documentation"
+msgstr ""
+
+#: sphinx/environment.py:119 sphinx/writers/latex.py:190
+#: sphinx/writers/manpage.py:67 sphinx/writers/texinfo.py:203
+#, python-format
+msgid "%B %d, %Y"
+msgstr ""
+
+#: sphinx/environment.py:1625
+#, python-format
+msgid "see %s"
+msgstr ""
+
+#: sphinx/environment.py:1628
+#, fuzzy, python-format
+msgid "see also %s"
+msgstr "همچنین ملاحظه نمائید %s"
+
+#: sphinx/roles.py:175
+#, python-format
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr "Python Enhancement Proposals; PEP %s"
+
+#: sphinx/builders/changes.py:73
+msgid "Builtins"
+msgstr "درونی سازی"
+
+#: sphinx/builders/changes.py:75
+msgid "Module level"
+msgstr "در سطح ماژول"
+
+#: sphinx/builders/html.py:274
+#, python-format
+msgid "%b %d, %Y"
+msgstr ""
+
+#: sphinx/builders/html.py:293 sphinx/themes/basic/defindex.html:30
+msgid "General Index"
+msgstr "فهرست کلی"
+
+#: sphinx/builders/html.py:293
+msgid "index"
+msgstr "فهرست"
+
+#: sphinx/builders/html.py:353
+msgid "next"
+msgstr "بعدی"
+
+#: sphinx/builders/html.py:362
+msgid "previous"
+msgstr "قبلی"
+
+#: sphinx/builders/latex.py:141 sphinx/builders/texinfo.py:196
+msgid " (in "
+msgstr ""
+
+#: sphinx/directives/other.py:136
+msgid "Section author: "
+msgstr ":نویسنده این بخش"
+
+#: sphinx/directives/other.py:138
+msgid "Module author: "
+msgstr "نویسنده این ماژول:"
+
+#: sphinx/directives/other.py:140
+#, fuzzy
+msgid "Code author: "
+msgstr "نویسنده این ماژول:"
+
+#: sphinx/directives/other.py:142
+msgid "Author: "
+msgstr ":نویسنده"
+
+#: sphinx/directives/other.py:215
+msgid "See also"
+msgstr "همچنین ملاحظه نمائید"
+
+#: sphinx/domains/__init__.py:244
+#, python-format
+msgid "%s %s"
+msgstr ""
+
+#: sphinx/domains/c.py:51 sphinx/domains/python.py:95
+msgid "Parameters"
+msgstr "پارامترها"
+
+#: sphinx/domains/c.py:54 sphinx/domains/javascript.py:128
+#: sphinx/domains/python.py:107
+msgid "Returns"
+msgstr ""
+
+#: sphinx/domains/c.py:56 sphinx/domains/python.py:109
+msgid "Return type"
+msgstr "نوع برگشتی"
+
+#: sphinx/domains/c.py:141
+#, python-format
+msgid "%s (C function)"
+msgstr "%s (C تابع)"
+
+#: sphinx/domains/c.py:143
+#, python-format
+msgid "%s (C member)"
+msgstr "%s (C عضو)"
+
+#: sphinx/domains/c.py:145
+#, python-format
+msgid "%s (C macro)"
+msgstr "%s (C ماکرو)"
+
+#: sphinx/domains/c.py:147
+#, python-format
+msgid "%s (C type)"
+msgstr "%s (C نوع)"
+
+#: sphinx/domains/c.py:149
+#, python-format
+msgid "%s (C variable)"
+msgstr "%s (C متغیر)"
+
+#: sphinx/domains/c.py:204 sphinx/domains/cpp.py:1060
+#: sphinx/domains/javascript.py:162 sphinx/domains/python.py:559
+#, fuzzy
+msgid "function"
+msgstr "تابع"
+
+#: sphinx/domains/c.py:205 sphinx/domains/cpp.py:1061
+#, fuzzy
+msgid "member"
+msgstr "عضو"
+
+#: sphinx/domains/c.py:206
+msgid "macro"
+msgstr ""
+
+#: sphinx/domains/c.py:207 sphinx/domains/cpp.py:1062
+msgid "type"
+msgstr ""
+
+#: sphinx/domains/c.py:208
+#, fuzzy
+msgid "variable"
+msgstr "متغیر"
+
+#: sphinx/domains/cpp.py:904
+#, fuzzy, python-format
+msgid "%s (C++ class)"
+msgstr "%s (C++ کلاس در)"
+
+#: sphinx/domains/cpp.py:919
+#, fuzzy, python-format
+msgid "%s (C++ type)"
+msgstr "%s (C++ نوع)"
+
+#: sphinx/domains/cpp.py:938
+#, fuzzy, python-format
+msgid "%s (C++ member)"
+msgstr "%s (C++ عضو)"
+
+#: sphinx/domains/cpp.py:990
+#, fuzzy, python-format
+msgid "%s (C++ function)"
+msgstr "%s (C++ تابع)"
+
+#: sphinx/domains/cpp.py:1059 sphinx/domains/javascript.py:163
+#: sphinx/domains/python.py:561
+msgid "class"
+msgstr ""
+
+#: sphinx/domains/javascript.py:106 sphinx/domains/python.py:254
+#, python-format
+msgid "%s() (built-in function)"
+msgstr "%s() (توابع درونی)"
+
+#: sphinx/domains/javascript.py:107 sphinx/domains/python.py:318
+#, python-format
+msgid "%s() (%s method)"
+msgstr "%s() (%s متد)"
+
+#: sphinx/domains/javascript.py:109
+#, fuzzy, python-format
+msgid "%s() (class)"
+msgstr "%s() (کلاس در)"
+
+#: sphinx/domains/javascript.py:111
+#, python-format
+msgid "%s (global variable or constant)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:113 sphinx/domains/python.py:356
+#, python-format
+msgid "%s (%s attribute)"
+msgstr "%s (%s مشخصه)"
+
+#: sphinx/domains/javascript.py:122
+#, fuzzy
+msgid "Arguments"
+msgstr "پارامترها"
+
+#: sphinx/domains/javascript.py:125
+msgid "Throws"
+msgstr ""
+
+#: sphinx/domains/javascript.py:164 sphinx/domains/python.py:560
+msgid "data"
+msgstr ""
+
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:566
+msgid "attribute"
+msgstr ""
+
+#: sphinx/domains/python.py:100
+#, fuzzy
+msgid "Variables"
+msgstr "متغیر"
+
+#: sphinx/domains/python.py:104
+msgid "Raises"
+msgstr "برانگیختن"
+
+#: sphinx/domains/python.py:255 sphinx/domains/python.py:312
+#: sphinx/domains/python.py:324 sphinx/domains/python.py:337
+#, python-format
+msgid "%s() (in module %s)"
+msgstr "%s() (در ماژول %s)"
+
+#: sphinx/domains/python.py:258
+#, python-format
+msgid "%s (built-in variable)"
+msgstr "%s (متغیر درونی)"
+
+#: sphinx/domains/python.py:259 sphinx/domains/python.py:350
+#, python-format
+msgid "%s (in module %s)"
+msgstr "%s (در ماژول %s)"
+
+#: sphinx/domains/python.py:275
+#, python-format
+msgid "%s (built-in class)"
+msgstr "%s (کلاس درونی)"
+
+#: sphinx/domains/python.py:276
+#, python-format
+msgid "%s (class in %s)"
+msgstr "%s (کلاس در %s)"
+
+#: sphinx/domains/python.py:316
+#, python-format
+msgid "%s() (%s.%s method)"
+msgstr "%s() (%s.%s متد)"
+
+#: sphinx/domains/python.py:328
+#, python-format
+msgid "%s() (%s.%s static method)"
+msgstr "%s() (%s.%s متد استاتیک)"
+
+#: sphinx/domains/python.py:331
+#, python-format
+msgid "%s() (%s static method)"
+msgstr "%s() (%s متد استاتیک)"
+
+#: sphinx/domains/python.py:341
+#, fuzzy, python-format
+msgid "%s() (%s.%s class method)"
+msgstr "%s() (%s.%s متد)"
+
+#: sphinx/domains/python.py:344
+#, fuzzy, python-format
+msgid "%s() (%s class method)"
+msgstr "%s() (%s متد)"
+
+#: sphinx/domains/python.py:354
+#, python-format
+msgid "%s (%s.%s attribute)"
+msgstr "%s (%s.%s مشخصه)"
+
+#: sphinx/domains/python.py:434
+#, python-format
+msgid "%s (module)"
+msgstr "%s (ماژول)"
+
+#: sphinx/domains/python.py:491
+#, fuzzy
+msgid "Python Module Index"
+msgstr "فهرست ماژول ها"
+
+#: sphinx/domains/python.py:492
+msgid "modules"
+msgstr "ماژول ها"
+
+#: sphinx/domains/python.py:537
+msgid "Deprecated"
+msgstr "منسوخ شده"
+
+#: sphinx/domains/python.py:562 sphinx/locale/__init__.py:179
+msgid "exception"
+msgstr "استثناء"
+
+#: sphinx/domains/python.py:563
+msgid "method"
+msgstr ""
+
+#: sphinx/domains/python.py:564
+msgid "class method"
+msgstr ""
+
+#: sphinx/domains/python.py:565
+msgid "static method"
+msgstr ""
+
+#: sphinx/domains/python.py:567 sphinx/locale/__init__.py:175
+msgid "module"
+msgstr "ماژول"
+
+#: sphinx/domains/python.py:695
+#, fuzzy
+msgid " (deprecated)"
+msgstr " (منسوخ شده)"
+
+#: sphinx/domains/rst.py:55
+#, python-format
+msgid "%s (directive)"
+msgstr ""
+
+#: sphinx/domains/rst.py:57
+#, python-format
+msgid "%s (role)"
+msgstr ""
+
+#: sphinx/domains/rst.py:106
+msgid "directive"
+msgstr ""
+
+#: sphinx/domains/rst.py:107
+msgid "role"
+msgstr ""
+
+#: sphinx/domains/std.py:70 sphinx/domains/std.py:86
+#, python-format
+msgid "environment variable; %s"
+msgstr "%s متغیرهای عمومی؛"
+
+#: sphinx/domains/std.py:162
+#, python-format
+msgid "%scommand line option; %s"
+msgstr "%sگزینه خط فرمان; %s"
+
+#: sphinx/domains/std.py:393
+msgid "glossary term"
+msgstr ""
+
+#: sphinx/domains/std.py:394
+msgid "grammar token"
+msgstr ""
+
+#: sphinx/domains/std.py:395
+msgid "reference label"
+msgstr ""
+
+#: sphinx/domains/std.py:396
+#, fuzzy
+msgid "environment variable"
+msgstr "متغیرهای عمومی؛"
+
+#: sphinx/domains/std.py:397
+msgid "program option"
+msgstr ""
+
+#: sphinx/domains/std.py:427 sphinx/themes/basic/genindex-single.html:32
+#: sphinx/themes/basic/genindex-split.html:11
+#: sphinx/themes/basic/genindex-split.html:14
+#: sphinx/themes/basic/genindex.html:32 sphinx/themes/basic/genindex.html:35
+#: sphinx/themes/basic/genindex.html:68 sphinx/themes/basic/layout.html:134
+#: sphinx/writers/latex.py:179 sphinx/writers/texinfo.py:456
+msgid "Index"
+msgstr "فهرست"
+
+#: sphinx/domains/std.py:428
+msgid "Module Index"
+msgstr "فهرست ماژول ها"
+
+#: sphinx/domains/std.py:429 sphinx/themes/basic/defindex.html:25
+msgid "Search Page"
+msgstr "صفحه جستجو"
+
+#: sphinx/ext/autodoc.py:1002
+#, python-format
+msgid " Bases: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc.py:1038
+#, python-format
+msgid "alias of :class:`%s`"
+msgstr ""
+
+#: sphinx/ext/todo.py:41
+msgid "Todo"
+msgstr "در دست انجام"
+
+#: sphinx/ext/todo.py:109
+#, python-format
+msgid "(The <<original entry>> is located in %s, line %d.)"
+msgstr ""
+
+#: sphinx/ext/todo.py:117
+msgid "original entry"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:70
+msgid "[source]"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:117
+msgid "[docs]"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:131
+#, fuzzy
+msgid "Module code"
+msgstr "ماژول"
+
+#: sphinx/ext/viewcode.py:137
+#, python-format
+msgid "<h1>Source code for %s</h1>"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:164
+msgid "Overview: module code"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:165
+msgid "<h1>All modules for which code is available</h1>"
+msgstr ""
+
+#: sphinx/locale/__init__.py:155
+msgid "Attention"
+msgstr "دقت"
+
+#: sphinx/locale/__init__.py:156
+msgid "Caution"
+msgstr "ملاحظه"
+
+#: sphinx/locale/__init__.py:157
+msgid "Danger"
+msgstr "خطر"
+
+#: sphinx/locale/__init__.py:158
+msgid "Error"
+msgstr "خطا"
+
+#: sphinx/locale/__init__.py:159
+msgid "Hint"
+msgstr "تذکر"
+
+#: sphinx/locale/__init__.py:160
+msgid "Important"
+msgstr "مهم"
+
+#: sphinx/locale/__init__.py:161
+msgid "Note"
+msgstr "توجه"
+
+#: sphinx/locale/__init__.py:162
+msgid "See Also"
+msgstr "همچنین ملاحظه نمائید"
+
+#: sphinx/locale/__init__.py:163
+msgid "Tip"
+msgstr "نکته"
+
+#: sphinx/locale/__init__.py:164
+msgid "Warning"
+msgstr "هشدار"
+
+#: sphinx/locale/__init__.py:168
+#, python-format
+msgid "New in version %s"
+msgstr "جدید در نسخه %s"
+
+#: sphinx/locale/__init__.py:169
+#, python-format
+msgid "Changed in version %s"
+msgstr "تغییر داده شده در نسخه %s"
+
+#: sphinx/locale/__init__.py:170
+#, python-format
+msgid "Deprecated since version %s"
+msgstr "منسوخ شده از نسخه %s"
+
+#: sphinx/locale/__init__.py:176
+msgid "keyword"
+msgstr "کلمه کلیدی"
+
+#: sphinx/locale/__init__.py:177
+msgid "operator"
+msgstr "عملگر"
+
+#: sphinx/locale/__init__.py:178
+msgid "object"
+msgstr "شیء"
+
+#: sphinx/locale/__init__.py:180
+msgid "statement"
+msgstr "گذاره"
+
+#: sphinx/locale/__init__.py:181
+msgid "built-in function"
+msgstr "توابع درونی"
+
+#: sphinx/themes/agogo/layout.html:45 sphinx/themes/basic/globaltoc.html:10
+#: sphinx/themes/basic/localtoc.html:11
+msgid "Table Of Contents"
+msgstr "فهرست عناوین"
+
+#: sphinx/themes/agogo/layout.html:49 sphinx/themes/basic/layout.html:137
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:20
+msgid "Search"
+msgstr "جستجو"
+
+#: sphinx/themes/agogo/layout.html:52 sphinx/themes/basic/searchbox.html:15
+msgid "Go"
+msgstr "برو"
+
+#: sphinx/themes/agogo/layout.html:57 sphinx/themes/basic/searchbox.html:20
+#, fuzzy
+msgid "Enter search terms or a module, class or function name."
+msgstr "نام یک ماژول ، کلاس و یا تابع را وارد نمائید"
+
+#: sphinx/themes/agogo/layout.html:78 sphinx/themes/basic/sourcelink.html:14
+msgid "Show Source"
+msgstr "نمایش سورس"
+
+#: sphinx/themes/basic/defindex.html:11
+msgid "Overview"
+msgstr "بررسی اجمالی"
+
+#: sphinx/themes/basic/defindex.html:20
+msgid "Indices and tables:"
+msgstr "ایندکس ها و جداول:"
+
+#: sphinx/themes/basic/defindex.html:23
+msgid "Complete Table of Contents"
+msgstr "فهرست کامل مطالب"
+
+#: sphinx/themes/basic/defindex.html:24
+msgid "lists all sections and subsections"
+msgstr "فهرست تمامی بخش ها و زیر مجموعه ها"
+
+#: sphinx/themes/basic/defindex.html:26
+msgid "search this documentation"
+msgstr "جستجو در این اسناد"
+
+#: sphinx/themes/basic/defindex.html:28
+msgid "Global Module Index"
+msgstr "فهرست کلی ماژول ها"
+
+#: sphinx/themes/basic/defindex.html:29
+msgid "quick access to all modules"
+msgstr "دسترسی سریع به تمامی متدها"
+
+#: sphinx/themes/basic/defindex.html:31
+msgid "all functions, classes, terms"
+msgstr "تمامی توابع ، کلاس ها ، اصطلاحات"
+
+#: sphinx/themes/basic/genindex-single.html:35
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr "فهرست &ndash; %(key)s"
+
+#: sphinx/themes/basic/genindex-single.html:63
+#: sphinx/themes/basic/genindex-split.html:24
+#: sphinx/themes/basic/genindex-split.html:38
+#: sphinx/themes/basic/genindex.html:74
+msgid "Full index on one page"
+msgstr "فهرست کامل در یک صفحه"
+
+#: sphinx/themes/basic/genindex-split.html:16
+msgid "Index pages by letter"
+msgstr "فهرست صفحات بر اساس حروف"
+
+#: sphinx/themes/basic/genindex-split.html:25
+msgid "can be huge"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:29
+msgid "Navigation"
+msgstr "ناوبری"
+
+#: sphinx/themes/basic/layout.html:122
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr "جستجو در %(docstitle)s"
+
+#: sphinx/themes/basic/layout.html:131
+msgid "About these documents"
+msgstr "درباره این مستندات"
+
+#: sphinx/themes/basic/layout.html:140
+msgid "Copyright"
+msgstr "کپی رایت"
+
+#: sphinx/themes/basic/layout.html:189
+#, python-format
+msgid "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:191
+#, python-format
+msgid "&copy; Copyright %(copyright)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:195
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr ". %(last_updated)s آخرین بروز رسانی در"
+
+#: sphinx/themes/basic/layout.html:198
+#, python-format
+msgid ""
+"Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+". <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> %(sphinx_version)s "
+"ایجاد شده با"
+
+#: sphinx/themes/basic/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr "جستجو %(docstitle)s"
+
+#: sphinx/themes/basic/relations.html:11
+msgid "Previous topic"
+msgstr "موضوع قبلی"
+
+#: sphinx/themes/basic/relations.html:13
+msgid "previous chapter"
+msgstr "فصل قبلی"
+
+#: sphinx/themes/basic/relations.html:16
+msgid "Next topic"
+msgstr "موضوع بعدی"
+
+#: sphinx/themes/basic/relations.html:18
+msgid "next chapter"
+msgstr "فصل بعدی"
+
+#: sphinx/themes/basic/search.html:24
+msgid ""
+"Please activate JavaScript to enable the search\n"
+" functionality."
+msgstr ""
+
+#: sphinx/themes/basic/search.html:29
+#, fuzzy
+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 ""
+"در اینجا شما می توانید مستندات را جستجو نمائید ، کلماتی را در کادر جستجو "
+"وارد کنید و سپس بر روی دکمه جستجو کلیک نمائید ، توجه کنید که تابع جستجو "
+"گر امر جستجو را بطور خودکار برای تمامی کلمات دنبال خواهد کرد .صفحاتی که "
+"شامل کلمات کمتری هستند ، در لیست جستجو نمایش داده نخواهند شد."
+
+#: sphinx/themes/basic/search.html:36
+msgid "search"
+msgstr "جستجو"
+
+#: sphinx/themes/basic/search.html:40
+msgid "Search Results"
+msgstr "نتایج جستجو"
+
+#: sphinx/themes/basic/search.html:42
+msgid "Your search did not match any results."
+msgstr ".جستجوی شما نتیجه ایی در بر نداشت"
+
+#: sphinx/themes/basic/searchbox.html:12
+msgid "Quick search"
+msgstr "جستجو سریع"
+
+#: sphinx/themes/basic/sourcelink.html:11
+msgid "This Page"
+msgstr "صفحه فعلی"
+
+#: sphinx/themes/basic/changes/frameset.html:5
+#: sphinx/themes/basic/changes/versionchanges.html:12
+#, python-format
+msgid "Changes in Version %(version)s &mdash; %(docstitle)s"
+msgstr "تغییرات در نسخه %(version)s &mdash; %(docstitle)s"
+
+#: sphinx/themes/basic/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &mdash; %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr "لیست تولید شده خودکار از تغییرات در نسخه %(version)s"
+
+#: sphinx/themes/basic/changes/versionchanges.html:18
+msgid "Library changes"
+msgstr "تغییرات کتابخانه ایی"
+
+#: sphinx/themes/basic/changes/versionchanges.html:23
+msgid "C API changes"
+msgstr "C API تغییرات"
+
+#: sphinx/themes/basic/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr "دگر تغییرات"
+
+#: sphinx/themes/basic/static/doctools.js:154 sphinx/writers/html.py:504
+#: sphinx/writers/html.py:510
+msgid "Permalink to this headline"
+msgstr "لینک ثابت به این سر مقاله"
+
+#: sphinx/themes/basic/static/doctools.js:160 sphinx/writers/html.py:92
+msgid "Permalink to this definition"
+msgstr "لینک ثابت به این تعریف"
+
+#: sphinx/themes/basic/static/doctools.js:189
+msgid "Hide Search Matches"
+msgstr "عدم نمایش نتایج یافت شده"
+
+#: sphinx/themes/default/static/sidebar.js:69
+msgid "Expand sidebar"
+msgstr ""
+
+#: sphinx/themes/default/static/sidebar.js:82
+#: sphinx/themes/default/static/sidebar.js:110
+msgid "Collapse sidebar"
+msgstr ""
+
+#: sphinx/themes/haiku/layout.html:26
+msgid "Contents"
+msgstr ""
+
+#: sphinx/writers/latex.py:177
+msgid "Release"
+msgstr "انتشار"
+
+#: sphinx/writers/latex.py:594 sphinx/writers/manpage.py:182
+#: sphinx/writers/texinfo.py:589
+msgid "Footnotes"
+msgstr ""
+
+#: sphinx/writers/latex.py:676
+msgid "continued from previous page"
+msgstr ""
+
+#: sphinx/writers/latex.py:681
+#, fuzzy
+msgid "Continued on next page"
+msgstr "فهرست کامل در یک صفحه"
+
+#: sphinx/writers/text.py:437
+msgid "[image]"
+msgstr ""
+
diff --git a/sphinx/locale/fi/LC_MESSAGES/sphinx.js b/sphinx/locale/fi/LC_MESSAGES/sphinx.js
index 9d2cc6f4..1f160037 100644
--- a/sphinx/locale/fi/LC_MESSAGES/sphinx.js
+++ b/sphinx/locale/fi/LC_MESSAGES/sphinx.js
@@ -1 +1 @@
-Documentation.addTranslations({"locale": "fi", "plural_expr": "(n != 1)", "messages": {"Search Results": "Etsinn\u00e4n tulos", "Preparing search...": "Valmistellaan etsint\u00e4\u00e4...", "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "Ei l\u00f6ytynyt yht\u00e4\u00e4n. Tarkista hakuehdot, sanahaku, ei sen osia", "Search finished, found %s page(s) matching the search query.": "Etsint\u00e4 tehty, l\u00f6ydetty %s sivu(a).", ", in ": "", "Expand sidebar": "", "Permalink to this headline": "", "Searching": "Etsit\u00e4\u00e4n", "Collapse sidebar": "", "Permalink to this definition": "", "Hide Search Matches": "Piilota l\u00f6ydetyt"}}); \ No newline at end of file
+Documentation.addTranslations({"locale": "fi", "plural_expr": "(n != 1)", "messages": {"Hide Search Matches": "Piilota l\u00f6ydetyt", "Permalink to this definition": "", "Expand sidebar": "", "Permalink to this headline": "", "Collapse sidebar": ""}}); \ No newline at end of file
diff --git a/sphinx/locale/fi/LC_MESSAGES/sphinx.mo b/sphinx/locale/fi/LC_MESSAGES/sphinx.mo
index 7c300006..497088c8 100644
--- a/sphinx/locale/fi/LC_MESSAGES/sphinx.mo
+++ b/sphinx/locale/fi/LC_MESSAGES/sphinx.mo
Binary files differ
diff --git a/sphinx/locale/fi/LC_MESSAGES/sphinx.po b/sphinx/locale/fi/LC_MESSAGES/sphinx.po
index 77076231..4a329546 100644
--- a/sphinx/locale/fi/LC_MESSAGES/sphinx.po
+++ b/sphinx/locale/fi/LC_MESSAGES/sphinx.po
@@ -7,384 +7,404 @@ 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: 2010-05-24 23:54+0200\n"
+"POT-Creation-Date: 2011-09-21 10:06+0200\n"
+"PO-Revision-Date: 2011-01-22 14:41+0100\n"
"Last-Translator: Jukka Inkeri <sphinx@awot.fi>\n"
"Language-Team: fi <sphinx@awot.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"
+"Generated-By: Babel 0.9.6\n"
-#: sphinx/environment.py:106 sphinx/writers/latex.py:184
-#: sphinx/writers/manpage.py:67
+#: sphinx/config.py:81
+#, python-format
+msgid "%s %s documentation"
+msgstr ""
+
+#: sphinx/environment.py:119 sphinx/writers/latex.py:190
+#: sphinx/writers/manpage.py:67 sphinx/writers/texinfo.py:203
#, python-format
msgid "%B %d, %Y"
msgstr "%d.%m.%Y"
-#: sphinx/roles.py:174
+#: sphinx/environment.py:1625
#, python-format
-msgid "Python Enhancement Proposals!PEP %s"
+msgid "see %s"
msgstr ""
-#: sphinx/builders/changes.py:72
+#: sphinx/environment.py:1628
+#, fuzzy, python-format
+msgid "see also %s"
+msgstr "katso myös %s"
+
+#: sphinx/roles.py:175
+#, python-format
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr "Python Enhancement Proposals; PEP %s"
+
+#: sphinx/builders/changes.py:73
msgid "Builtins"
msgstr ""
-#: sphinx/builders/changes.py:74
+#: sphinx/builders/changes.py:75
msgid "Module level"
msgstr "Moduulitaso"
-#: sphinx/builders/html.py:266
+#: sphinx/builders/html.py:274
#, python-format
msgid "%b %d, %Y"
msgstr "%d.%m.%Y"
-#: sphinx/builders/html.py:285 sphinx/themes/basic/defindex.html:30
+#: sphinx/builders/html.py:293 sphinx/themes/basic/defindex.html:30
msgid "General Index"
msgstr "Yleinen sisällysluettelo"
-#: sphinx/builders/html.py:285
+#: sphinx/builders/html.py:293
msgid "index"
msgstr "hakemisto"
-#: sphinx/builders/html.py:345
+#: sphinx/builders/html.py:353
msgid "next"
msgstr ">"
-#: sphinx/builders/html.py:354
+#: sphinx/builders/html.py:362
msgid "previous"
msgstr "<"
-#: sphinx/builders/latex.py:151
+#: sphinx/builders/latex.py:141 sphinx/builders/texinfo.py:196
msgid " (in "
msgstr ""
-#: sphinx/directives/other.py:127
+#: sphinx/directives/other.py:136
msgid "Section author: "
msgstr "Luvun kirjoittaja: "
-#: sphinx/directives/other.py:129
+#: sphinx/directives/other.py:138
msgid "Module author: "
msgstr "Moduulin kirjoittaja: "
-#: sphinx/directives/other.py:131
+#: sphinx/directives/other.py:140
#, fuzzy
msgid "Code author: "
msgstr "Moduulin kirjoittaja: "
-#: sphinx/directives/other.py:133
+#: sphinx/directives/other.py:142
msgid "Author: "
msgstr "Tekijä: "
-#: sphinx/directives/other.py:238
+#: sphinx/directives/other.py:215
msgid "See also"
msgstr "Katso myös"
-#: sphinx/domains/__init__.py:253
+#: sphinx/domains/__init__.py:244
#, python-format
msgid "%s %s"
msgstr ""
-#: sphinx/domains/c.py:51 sphinx/domains/python.py:49
+#: sphinx/domains/c.py:51 sphinx/domains/python.py:95
msgid "Parameters"
msgstr ""
-#: sphinx/domains/c.py:54 sphinx/domains/javascript.py:137
-#: sphinx/domains/python.py:59
+#: sphinx/domains/c.py:54 sphinx/domains/javascript.py:128
+#: sphinx/domains/python.py:107
msgid "Returns"
msgstr ""
-#: sphinx/domains/c.py:56 sphinx/domains/python.py:61
+#: sphinx/domains/c.py:56 sphinx/domains/python.py:109
msgid "Return type"
msgstr ""
-#: sphinx/domains/c.py:133
+#: sphinx/domains/c.py:141
#, python-format
msgid "%s (C function)"
msgstr ""
-#: sphinx/domains/c.py:135
+#: sphinx/domains/c.py:143
#, python-format
msgid "%s (C member)"
msgstr ""
-#: sphinx/domains/c.py:137
+#: sphinx/domains/c.py:145
#, python-format
msgid "%s (C macro)"
msgstr ""
-#: sphinx/domains/c.py:139
+#: sphinx/domains/c.py:147
#, python-format
msgid "%s (C type)"
msgstr ""
-#: sphinx/domains/c.py:141
+#: sphinx/domains/c.py:149
#, python-format
msgid "%s (C variable)"
msgstr ""
-#: sphinx/domains/c.py:171 sphinx/domains/cpp.py:1031
-#: sphinx/domains/javascript.py:166 sphinx/domains/python.py:497
+#: sphinx/domains/c.py:204 sphinx/domains/cpp.py:1060
+#: sphinx/domains/javascript.py:162 sphinx/domains/python.py:559
#, fuzzy
msgid "function"
msgstr "Varoitus"
-#: sphinx/domains/c.py:172 sphinx/domains/cpp.py:1032
+#: sphinx/domains/c.py:205 sphinx/domains/cpp.py:1061
msgid "member"
msgstr ""
-#: sphinx/domains/c.py:173
+#: sphinx/domains/c.py:206
msgid "macro"
msgstr ""
-#: sphinx/domains/c.py:174 sphinx/domains/cpp.py:1033
+#: sphinx/domains/c.py:207 sphinx/domains/cpp.py:1062
msgid "type"
msgstr ""
-#: sphinx/domains/c.py:175
+#: sphinx/domains/c.py:208
msgid "variable"
msgstr ""
-#: sphinx/domains/cpp.py:876
+#: sphinx/domains/cpp.py:904
#, python-format
msgid "%s (C++ class)"
msgstr ""
-#: sphinx/domains/cpp.py:891
+#: sphinx/domains/cpp.py:919
#, python-format
msgid "%s (C++ type)"
msgstr ""
-#: sphinx/domains/cpp.py:910
+#: sphinx/domains/cpp.py:938
#, python-format
msgid "%s (C++ member)"
msgstr ""
-#: sphinx/domains/cpp.py:962
+#: sphinx/domains/cpp.py:990
#, python-format
msgid "%s (C++ function)"
msgstr ""
-#: sphinx/domains/cpp.py:1030 sphinx/domains/python.py:499
+#: sphinx/domains/cpp.py:1059 sphinx/domains/javascript.py:163
+#: sphinx/domains/python.py:561
msgid "class"
msgstr ""
-#: sphinx/domains/javascript.py:117 sphinx/domains/python.py:221
+#: sphinx/domains/javascript.py:106 sphinx/domains/python.py:254
#, python-format
msgid "%s() (built-in function)"
msgstr ""
-#: sphinx/domains/javascript.py:118 sphinx/domains/python.py:285
+#: sphinx/domains/javascript.py:107 sphinx/domains/python.py:318
#, python-format
msgid "%s() (%s method)"
msgstr ""
-#: sphinx/domains/javascript.py:120
+#: sphinx/domains/javascript.py:109
+#, python-format
+msgid "%s() (class)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:111
#, python-format
msgid "%s (global variable or constant)"
msgstr ""
-#: sphinx/domains/javascript.py:122 sphinx/domains/python.py:323
+#: sphinx/domains/javascript.py:113 sphinx/domains/python.py:356
#, python-format
msgid "%s (%s attribute)"
msgstr ""
-#: sphinx/domains/javascript.py:131
+#: sphinx/domains/javascript.py:122
msgid "Arguments"
msgstr ""
-#: sphinx/domains/javascript.py:134
+#: sphinx/domains/javascript.py:125
msgid "Throws"
msgstr ""
-#: sphinx/domains/javascript.py:167 sphinx/domains/python.py:498
+#: sphinx/domains/javascript.py:164 sphinx/domains/python.py:560
msgid "data"
msgstr ""
-#: sphinx/domains/javascript.py:168 sphinx/domains/python.py:504
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:566
msgid "attribute"
msgstr ""
-#: sphinx/domains/python.py:53
+#: sphinx/domains/python.py:100
msgid "Variables"
msgstr ""
-#: sphinx/domains/python.py:56
+#: sphinx/domains/python.py:104
msgid "Raises"
msgstr ""
-#: sphinx/domains/python.py:222 sphinx/domains/python.py:279
-#: sphinx/domains/python.py:291 sphinx/domains/python.py:304
+#: sphinx/domains/python.py:255 sphinx/domains/python.py:312
+#: sphinx/domains/python.py:324 sphinx/domains/python.py:337
#, python-format
msgid "%s() (in module %s)"
msgstr ""
-#: sphinx/domains/python.py:225
+#: sphinx/domains/python.py:258
#, python-format
msgid "%s (built-in variable)"
msgstr ""
-#: sphinx/domains/python.py:226 sphinx/domains/python.py:317
+#: sphinx/domains/python.py:259 sphinx/domains/python.py:350
#, python-format
msgid "%s (in module %s)"
msgstr ""
-#: sphinx/domains/python.py:242
+#: sphinx/domains/python.py:275
#, python-format
msgid "%s (built-in class)"
msgstr ""
-#: sphinx/domains/python.py:243
+#: sphinx/domains/python.py:276
#, python-format
msgid "%s (class in %s)"
msgstr ""
-#: sphinx/domains/python.py:283
+#: sphinx/domains/python.py:316
#, python-format
msgid "%s() (%s.%s method)"
msgstr ""
-#: sphinx/domains/python.py:295
+#: sphinx/domains/python.py:328
#, python-format
msgid "%s() (%s.%s static method)"
msgstr ""
-#: sphinx/domains/python.py:298
+#: sphinx/domains/python.py:331
#, python-format
msgid "%s() (%s static method)"
msgstr ""
-#: sphinx/domains/python.py:308
+#: sphinx/domains/python.py:341
#, python-format
msgid "%s() (%s.%s class method)"
msgstr ""
-#: sphinx/domains/python.py:311
+#: sphinx/domains/python.py:344
#, python-format
msgid "%s() (%s class method)"
msgstr ""
-#: sphinx/domains/python.py:321
+#: sphinx/domains/python.py:354
#, python-format
msgid "%s (%s.%s attribute)"
msgstr ""
-#: sphinx/domains/python.py:366
-msgid "Platforms: "
-msgstr "Ympäristö"
-
-#: sphinx/domains/python.py:372
+#: sphinx/domains/python.py:434
#, python-format
msgid "%s (module)"
msgstr "%s (moduuli)"
-#: sphinx/domains/python.py:429
+#: sphinx/domains/python.py:491
#, fuzzy
msgid "Python Module Index"
msgstr "Moduuli sisällysluettelo"
-#: sphinx/domains/python.py:430
+#: sphinx/domains/python.py:492
msgid "modules"
msgstr "moduulit"
-#: sphinx/domains/python.py:475
+#: sphinx/domains/python.py:537
msgid "Deprecated"
msgstr "Poistettu"
-#: sphinx/domains/python.py:500 sphinx/locale/__init__.py:162
+#: sphinx/domains/python.py:562 sphinx/locale/__init__.py:179
msgid "exception"
msgstr ""
-#: sphinx/domains/python.py:501
+#: sphinx/domains/python.py:563
msgid "method"
msgstr ""
-#: sphinx/domains/python.py:502
+#: sphinx/domains/python.py:564
msgid "class method"
msgstr ""
-#: sphinx/domains/python.py:503
+#: sphinx/domains/python.py:565
msgid "static method"
msgstr ""
-#: sphinx/domains/python.py:505 sphinx/locale/__init__.py:158
+#: sphinx/domains/python.py:567 sphinx/locale/__init__.py:175
msgid "module"
msgstr "moduuli"
-#: sphinx/domains/rst.py:53
+#: sphinx/domains/python.py:695
+msgid " (deprecated)"
+msgstr " (poistettu)"
+
+#: sphinx/domains/rst.py:55
#, python-format
msgid "%s (directive)"
msgstr ""
-#: sphinx/domains/rst.py:55
-#, fuzzy, python-format
+#: sphinx/domains/rst.py:57
+#, python-format
msgid "%s (role)"
-msgstr "%s (moduuli)"
+msgstr ""
-#: sphinx/domains/rst.py:103
+#: sphinx/domains/rst.py:106
msgid "directive"
msgstr ""
-#: sphinx/domains/rst.py:104
-#, fuzzy
+#: sphinx/domains/rst.py:107
msgid "role"
-msgstr "moduuli"
+msgstr ""
-#: sphinx/domains/std.py:68 sphinx/domains/std.py:84
+#: sphinx/domains/std.py:70 sphinx/domains/std.py:86
#, python-format
msgid "environment variable; %s"
msgstr ""
-#: sphinx/domains/std.py:160
+#: sphinx/domains/std.py:162
#, python-format
msgid "%scommand line option; %s"
msgstr ""
-#: sphinx/domains/std.py:328
+#: sphinx/domains/std.py:393
msgid "glossary term"
msgstr ""
-#: sphinx/domains/std.py:329
+#: sphinx/domains/std.py:394
msgid "grammar token"
msgstr ""
-#: sphinx/domains/std.py:330
+#: sphinx/domains/std.py:395
msgid "reference label"
msgstr ""
-#: sphinx/domains/std.py:331
+#: sphinx/domains/std.py:396
msgid "environment variable"
msgstr ""
-#: sphinx/domains/std.py:332
+#: sphinx/domains/std.py:397
msgid "program option"
msgstr ""
-#: sphinx/domains/std.py:360 sphinx/themes/basic/genindex-single.html:11
+#: sphinx/domains/std.py:427 sphinx/themes/basic/genindex-single.html:32
#: sphinx/themes/basic/genindex-split.html:11
#: sphinx/themes/basic/genindex-split.html:14
-#: sphinx/themes/basic/genindex.html:11 sphinx/themes/basic/genindex.html:14
-#: sphinx/themes/basic/genindex.html:50 sphinx/themes/basic/layout.html:125
-#: sphinx/writers/latex.py:173
+#: sphinx/themes/basic/genindex.html:32 sphinx/themes/basic/genindex.html:35
+#: sphinx/themes/basic/genindex.html:68 sphinx/themes/basic/layout.html:134
+#: sphinx/writers/latex.py:179 sphinx/writers/texinfo.py:456
msgid "Index"
msgstr "Sisällysluettelo"
-#: sphinx/domains/std.py:361
+#: sphinx/domains/std.py:428
msgid "Module Index"
msgstr "Moduuli sisällysluettelo"
-#: sphinx/domains/std.py:362 sphinx/themes/basic/defindex.html:25
+#: sphinx/domains/std.py:429 sphinx/themes/basic/defindex.html:25
msgid "Search Page"
msgstr "Etsi sivu"
-#: sphinx/ext/autodoc.py:917
+#: sphinx/ext/autodoc.py:1002
#, python-format
msgid " Bases: %s"
msgstr ""
-#: sphinx/ext/autodoc.py:950
+#: sphinx/ext/autodoc.py:1038
#, python-format
msgid "alias of :class:`%s`"
msgstr ""
@@ -402,104 +422,104 @@ msgstr ""
msgid "original entry"
msgstr ""
-#: sphinx/ext/viewcode.py:66
+#: sphinx/ext/viewcode.py:70
msgid "[source]"
msgstr ""
-#: sphinx/ext/viewcode.py:109
+#: sphinx/ext/viewcode.py:117
msgid "[docs]"
msgstr ""
-#: sphinx/ext/viewcode.py:123
+#: sphinx/ext/viewcode.py:131
#, fuzzy
msgid "Module code"
msgstr "moduuli"
-#: sphinx/ext/viewcode.py:129
+#: sphinx/ext/viewcode.py:137
#, python-format
msgid "<h1>Source code for %s</h1>"
msgstr ""
-#: sphinx/ext/viewcode.py:156
+#: sphinx/ext/viewcode.py:164
msgid "Overview: module code"
msgstr ""
-#: sphinx/ext/viewcode.py:157
+#: sphinx/ext/viewcode.py:165
msgid "<h1>All modules for which code is available</h1>"
msgstr ""
-#: sphinx/locale/__init__.py:139
+#: sphinx/locale/__init__.py:155
msgid "Attention"
msgstr "Huom"
-#: sphinx/locale/__init__.py:140
+#: sphinx/locale/__init__.py:156
msgid "Caution"
msgstr "Varoitus"
-#: sphinx/locale/__init__.py:141
+#: sphinx/locale/__init__.py:157
msgid "Danger"
msgstr "Vaara"
-#: sphinx/locale/__init__.py:142
+#: sphinx/locale/__init__.py:158
msgid "Error"
msgstr "Virhe"
-#: sphinx/locale/__init__.py:143
+#: sphinx/locale/__init__.py:159
msgid "Hint"
msgstr "Vihje"
-#: sphinx/locale/__init__.py:144
+#: sphinx/locale/__init__.py:160
msgid "Important"
msgstr "Tärkeä"
-#: sphinx/locale/__init__.py:145
+#: sphinx/locale/__init__.py:161
msgid "Note"
msgstr "Muista"
-#: sphinx/locale/__init__.py:146
+#: sphinx/locale/__init__.py:162
msgid "See Also"
msgstr "Katso myös"
-#: sphinx/locale/__init__.py:147
+#: sphinx/locale/__init__.py:163
msgid "Tip"
msgstr "Vihje"
-#: sphinx/locale/__init__.py:148
+#: sphinx/locale/__init__.py:164
msgid "Warning"
msgstr "Varoitus"
-#: sphinx/locale/__init__.py:152
+#: sphinx/locale/__init__.py:168
#, python-format
msgid "New in version %s"
msgstr "Uusi versiossa %s"
-#: sphinx/locale/__init__.py:153
+#: sphinx/locale/__init__.py:169
#, python-format
msgid "Changed in version %s"
msgstr "Muutettu versiossa %s"
-#: sphinx/locale/__init__.py:154
+#: sphinx/locale/__init__.py:170
#, python-format
msgid "Deprecated since version %s"
msgstr "Poistettu versiosta %s alkaen"
-#: sphinx/locale/__init__.py:159
+#: sphinx/locale/__init__.py:176
msgid "keyword"
msgstr ""
-#: sphinx/locale/__init__.py:160
+#: sphinx/locale/__init__.py:177
msgid "operator"
msgstr ""
-#: sphinx/locale/__init__.py:161
+#: sphinx/locale/__init__.py:178
msgid "object"
msgstr ""
-#: sphinx/locale/__init__.py:163
+#: sphinx/locale/__init__.py:180
msgid "statement"
msgstr ""
-#: sphinx/locale/__init__.py:164
+#: sphinx/locale/__init__.py:181
msgid "built-in function"
msgstr ""
@@ -508,8 +528,8 @@ msgstr ""
msgid "Table Of Contents"
msgstr "Sisällysluettelo"
-#: sphinx/themes/agogo/layout.html:49 sphinx/themes/basic/layout.html:128
-#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:14
+#: sphinx/themes/agogo/layout.html:49 sphinx/themes/basic/layout.html:137
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:20
msgid "Search"
msgstr "Etsi"
@@ -557,15 +577,15 @@ msgstr ""
msgid "all functions, classes, terms"
msgstr ""
-#: sphinx/themes/basic/genindex-single.html:14
+#: sphinx/themes/basic/genindex-single.html:35
#, python-format
msgid "Index &ndash; %(key)s"
msgstr ""
-#: sphinx/themes/basic/genindex-single.html:46
+#: sphinx/themes/basic/genindex-single.html:63
#: sphinx/themes/basic/genindex-split.html:24
#: sphinx/themes/basic/genindex-split.html:38
-#: sphinx/themes/basic/genindex.html:56
+#: sphinx/themes/basic/genindex.html:74
msgid "Full index on one page"
msgstr "Hakemisto yhtenä luettelona"
@@ -577,39 +597,39 @@ msgstr "Hakemisto aakkostus sivuttain"
msgid "can be huge"
msgstr "voi olla iso"
-#: sphinx/themes/basic/layout.html:23
+#: sphinx/themes/basic/layout.html:29
msgid "Navigation"
msgstr "Navikointi"
-#: sphinx/themes/basic/layout.html:113
+#: sphinx/themes/basic/layout.html:122
#, python-format
msgid "Search within %(docstitle)s"
msgstr ""
-#: sphinx/themes/basic/layout.html:122
+#: sphinx/themes/basic/layout.html:131
msgid "About these documents"
msgstr "Tietoja tästä documentistä"
-#: sphinx/themes/basic/layout.html:131
+#: sphinx/themes/basic/layout.html:140
msgid "Copyright"
msgstr ""
-#: sphinx/themes/basic/layout.html:180
+#: sphinx/themes/basic/layout.html:189
#, python-format
msgid "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
msgstr ""
-#: sphinx/themes/basic/layout.html:182
+#: sphinx/themes/basic/layout.html:191
#, python-format
msgid "&copy; Copyright %(copyright)s."
msgstr ""
-#: sphinx/themes/basic/layout.html:186
+#: sphinx/themes/basic/layout.html:195
#, python-format
msgid "Last updated on %(last_updated)s."
msgstr ""
-#: sphinx/themes/basic/layout.html:189
+#: sphinx/themes/basic/layout.html:198
#, python-format
msgid ""
"Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
@@ -637,13 +657,13 @@ msgstr ">>"
msgid "next chapter"
msgstr ">>"
-#: sphinx/themes/basic/search.html:18
+#: sphinx/themes/basic/search.html:24
msgid ""
"Please activate JavaScript to enable the search\n"
" functionality."
msgstr "Javascript pitää olla sallittu, jotta etsintä toimii."
-#: sphinx/themes/basic/search.html:23
+#: sphinx/themes/basic/search.html:29
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"
@@ -651,16 +671,15 @@ msgid ""
" containing fewer words won't appear in the result list."
msgstr "Anna hakusanat kokonaan, osasanoilla ei haeta."
-#: sphinx/themes/basic/search.html:30
+#: sphinx/themes/basic/search.html:36
msgid "search"
msgstr "etsi"
-#: sphinx/themes/basic/search.html:34
-#: sphinx/themes/basic/static/searchtools.js:489
+#: sphinx/themes/basic/search.html:40
msgid "Search Results"
msgstr "Etsinnän tulos"
-#: sphinx/themes/basic/search.html:36
+#: sphinx/themes/basic/search.html:42
msgid "Your search did not match any results."
msgstr "Ei löytynyt ko. ehdoilla yhtään."
@@ -700,12 +719,12 @@ msgstr ""
msgid "Other changes"
msgstr ""
-#: sphinx/themes/basic/static/doctools.js:154 sphinx/writers/html.py:482
-#: sphinx/writers/html.py:487
+#: sphinx/themes/basic/static/doctools.js:154 sphinx/writers/html.py:504
+#: sphinx/writers/html.py:510
msgid "Permalink to this headline"
msgstr ""
-#: sphinx/themes/basic/static/doctools.js:160 sphinx/writers/html.py:87
+#: sphinx/themes/basic/static/doctools.js:160 sphinx/writers/html.py:92
msgid "Permalink to this definition"
msgstr ""
@@ -713,35 +732,12 @@ msgstr ""
msgid "Hide Search Matches"
msgstr "Piilota löydetyt"
-#: sphinx/themes/basic/static/searchtools.js:285
-msgid "Searching"
-msgstr "Etsitään"
-
-#: sphinx/themes/basic/static/searchtools.js:290
-msgid "Preparing search..."
-msgstr "Valmistellaan etsintää..."
-
-#: sphinx/themes/basic/static/searchtools.js:364
-msgid ", in "
-msgstr ""
-
-#: sphinx/themes/basic/static/searchtools.js:491
-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/themes/basic/static/searchtools.js:493
-#, python-format
-msgid "Search finished, found %s page(s) matching the search query."
-msgstr "Etsintä tehty, löydetty %s sivu(a)."
-
-#: sphinx/themes/default/static/sidebar.js:66
+#: sphinx/themes/default/static/sidebar.js:69
msgid "Expand sidebar"
msgstr ""
-#: sphinx/themes/default/static/sidebar.js:79
-#: sphinx/themes/default/static/sidebar.js:106
+#: sphinx/themes/default/static/sidebar.js:82
+#: sphinx/themes/default/static/sidebar.js:110
msgid "Collapse sidebar"
msgstr ""
@@ -749,24 +745,25 @@ msgstr ""
msgid "Contents"
msgstr ""
-#: sphinx/writers/latex.py:171
+#: sphinx/writers/latex.py:177
msgid "Release"
msgstr ""
-#: sphinx/writers/latex.py:572 sphinx/writers/manpage.py:178
+#: sphinx/writers/latex.py:594 sphinx/writers/manpage.py:182
+#: sphinx/writers/texinfo.py:589
msgid "Footnotes"
msgstr ""
-#: sphinx/writers/latex.py:641
+#: sphinx/writers/latex.py:676
msgid "continued from previous page"
msgstr ""
-#: sphinx/writers/latex.py:646
+#: sphinx/writers/latex.py:681
#, fuzzy
msgid "Continued on next page"
msgstr ""
-#: sphinx/writers/text.py:422
+#: sphinx/writers/text.py:437
msgid "[image]"
msgstr ""
diff --git a/sphinx/locale/fr/LC_MESSAGES/sphinx.js b/sphinx/locale/fr/LC_MESSAGES/sphinx.js
index e482673f..5d6fafbd 100644
--- a/sphinx/locale/fr/LC_MESSAGES/sphinx.js
+++ b/sphinx/locale/fr/LC_MESSAGES/sphinx.js
@@ -1 +1 @@
-Documentation.addTranslations({"locale": "fr", "plural_expr": "(n > 1)", "messages": {"Search Results": "R\u00e9sultats de la recherche", "Preparing search...": "Pr\u00e9paration de la recherche...", "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "Votre recherche ne correspond \u00e0 aucun document. V\u00e9rifiez l'orthographe des termes de recherche et que vous avez s\u00e9lectionn\u00e9 suffisamment de cat\u00e9gories.", "Search finished, found %s page(s) matching the search query.": "La recherche est termin\u00e9e, %s page(s) correspond(ent) \u00e0 la requ\u00eate.", ", in ": ", dans", "Expand sidebar": "Agrandir le menu", "Permalink to this headline": "Lien permanent vers ce titre", "Searching": "En cours de recherche", "Collapse sidebar": "R\u00e9duire le menu", "Permalink to this definition": "Lien permanent vers cette d\u00e9finition", "Hide Search Matches": "Cacher les r\u00e9sultats de la recherche"}}); \ No newline at end of file
+Documentation.addTranslations({"locale": "fr", "plural_expr": "(n > 1)", "messages": {"Hide Search Matches": "Cacher les r\u00e9sultats de la recherche", "Permalink to this definition": "Lien permanent vers cette d\u00e9finition", "Expand sidebar": "Agrandir le menu", "Permalink to this headline": "Lien permanent vers ce titre", "Collapse sidebar": "R\u00e9duire le menu"}}); \ No newline at end of file
diff --git a/sphinx/locale/fr/LC_MESSAGES/sphinx.mo b/sphinx/locale/fr/LC_MESSAGES/sphinx.mo
index bfa97b19..f123c004 100644
--- a/sphinx/locale/fr/LC_MESSAGES/sphinx.mo
+++ b/sphinx/locale/fr/LC_MESSAGES/sphinx.mo
Binary files differ
diff --git a/sphinx/locale/fr/LC_MESSAGES/sphinx.po b/sphinx/locale/fr/LC_MESSAGES/sphinx.po
index bdb13396..ab989cf9 100644
--- a/sphinx/locale/fr/LC_MESSAGES/sphinx.po
+++ b/sphinx/locale/fr/LC_MESSAGES/sphinx.po
@@ -10,387 +10,407 @@ msgid ""
msgstr ""
"Project-Id-Version: Sphinx 0.5\n"
"Report-Msgid-Bugs-To: larlet@gmail.com\n"
-"POT-Creation-Date: 2008-08-08 12:39+0000\n"
-"PO-Revision-Date: 2010-05-24 23:54+0200\n"
+"POT-Creation-Date: 2011-09-21 10:06+0200\n"
+"PO-Revision-Date: 2011-01-22 14:41+0100\n"
"Last-Translator: Sébastien Douche <sdouche@gmail.com>\n"
"Language-Team: French Translation Team <sphinx-dev@googlegroups.com>\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"
+"Generated-By: Babel 0.9.6\n"
-#: sphinx/environment.py:106 sphinx/writers/latex.py:184
-#: sphinx/writers/manpage.py:67
+#: sphinx/config.py:81
+#, fuzzy, python-format
+msgid "%s %s documentation"
+msgstr "%s %s documentation"
+
+#: sphinx/environment.py:119 sphinx/writers/latex.py:190
+#: sphinx/writers/manpage.py:67 sphinx/writers/texinfo.py:203
#, python-format
msgid "%B %d, %Y"
msgstr "%d %B %Y"
-#: sphinx/roles.py:174
+#: sphinx/environment.py:1625
+#, python-format
+msgid "see %s"
+msgstr "voir %s"
+
+#: sphinx/environment.py:1628
#, python-format
-msgid "Python Enhancement Proposals!PEP %s"
-msgstr "Python Enhancement Proposals!PEP %s"
+msgid "see also %s"
+msgstr "voir aussi %s"
-#: sphinx/builders/changes.py:72
+#: sphinx/roles.py:175
+#, python-format
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr "Python Enhancement Proposals; PEP %s"
+
+#: sphinx/builders/changes.py:73
msgid "Builtins"
msgstr "Fonctions de base"
-#: sphinx/builders/changes.py:74
+#: sphinx/builders/changes.py:75
msgid "Module level"
msgstr "Module"
-#: sphinx/builders/html.py:266
+#: sphinx/builders/html.py:274
#, python-format
msgid "%b %d, %Y"
msgstr "%d %b %Y"
-#: sphinx/builders/html.py:285 sphinx/themes/basic/defindex.html:30
+#: sphinx/builders/html.py:293 sphinx/themes/basic/defindex.html:30
msgid "General Index"
msgstr "Index général"
-#: sphinx/builders/html.py:285
+#: sphinx/builders/html.py:293
msgid "index"
msgstr "index"
-#: sphinx/builders/html.py:345
+#: sphinx/builders/html.py:353
msgid "next"
msgstr "suivant"
-#: sphinx/builders/html.py:354
+#: sphinx/builders/html.py:362
msgid "previous"
msgstr "précédent"
-#: sphinx/builders/latex.py:151
+#: sphinx/builders/latex.py:141 sphinx/builders/texinfo.py:196
msgid " (in "
msgstr "(dans"
-#: sphinx/directives/other.py:127
+#: sphinx/directives/other.py:136
msgid "Section author: "
msgstr "Auteur de la section : "
-#: sphinx/directives/other.py:129
+#: sphinx/directives/other.py:138
msgid "Module author: "
msgstr "Auteur du module : "
-#: sphinx/directives/other.py:131
+#: sphinx/directives/other.py:140
#, fuzzy
msgid "Code author: "
msgstr "Auteur du module : "
-#: sphinx/directives/other.py:133
+#: sphinx/directives/other.py:142
msgid "Author: "
msgstr "Auteur : "
-#: sphinx/directives/other.py:238
+#: sphinx/directives/other.py:215
msgid "See also"
msgstr "Voir aussi"
-#: sphinx/domains/__init__.py:253
+#: sphinx/domains/__init__.py:244
#, python-format
msgid "%s %s"
msgstr ""
-#: sphinx/domains/c.py:51 sphinx/domains/python.py:49
+#: sphinx/domains/c.py:51 sphinx/domains/python.py:95
msgid "Parameters"
msgstr "Paramètres"
-#: sphinx/domains/c.py:54 sphinx/domains/javascript.py:137
-#: sphinx/domains/python.py:59
+#: sphinx/domains/c.py:54 sphinx/domains/javascript.py:128
+#: sphinx/domains/python.py:107
msgid "Returns"
msgstr "Retourne"
-#: sphinx/domains/c.py:56 sphinx/domains/python.py:61
+#: sphinx/domains/c.py:56 sphinx/domains/python.py:109
msgid "Return type"
msgstr "Type retourné"
-#: sphinx/domains/c.py:133
+#: sphinx/domains/c.py:141
#, python-format
msgid "%s (C function)"
msgstr "%s (fonction C)"
-#: sphinx/domains/c.py:135
+#: sphinx/domains/c.py:143
#, python-format
msgid "%s (C member)"
msgstr "%s (membre C)"
-#: sphinx/domains/c.py:137
+#: sphinx/domains/c.py:145
#, python-format
msgid "%s (C macro)"
msgstr "%s (macro C)"
-#: sphinx/domains/c.py:139
+#: sphinx/domains/c.py:147
#, python-format
msgid "%s (C type)"
msgstr "%s (type C)"
-#: sphinx/domains/c.py:141
+#: sphinx/domains/c.py:149
#, python-format
msgid "%s (C variable)"
msgstr "%s (variable C)"
-#: sphinx/domains/c.py:171 sphinx/domains/cpp.py:1031
-#: sphinx/domains/javascript.py:166 sphinx/domains/python.py:497
+#: sphinx/domains/c.py:204 sphinx/domains/cpp.py:1060
+#: sphinx/domains/javascript.py:162 sphinx/domains/python.py:559
msgid "function"
msgstr "fonction"
-#: sphinx/domains/c.py:172 sphinx/domains/cpp.py:1032
+#: sphinx/domains/c.py:205 sphinx/domains/cpp.py:1061
msgid "member"
msgstr "membre"
-#: sphinx/domains/c.py:173
+#: sphinx/domains/c.py:206
msgid "macro"
msgstr ""
-#: sphinx/domains/c.py:174 sphinx/domains/cpp.py:1033
+#: sphinx/domains/c.py:207 sphinx/domains/cpp.py:1062
msgid "type"
msgstr "type"
-#: sphinx/domains/c.py:175
+#: sphinx/domains/c.py:208
#, fuzzy
msgid "variable"
msgstr "Variable"
-#: sphinx/domains/cpp.py:876
+#: sphinx/domains/cpp.py:904
#, python-format
msgid "%s (C++ class)"
msgstr "%s (classe C++)"
-#: sphinx/domains/cpp.py:891
+#: sphinx/domains/cpp.py:919
#, python-format
msgid "%s (C++ type)"
msgstr "%s (type C++)"
-#: sphinx/domains/cpp.py:910
+#: sphinx/domains/cpp.py:938
#, python-format
msgid "%s (C++ member)"
msgstr "%s (membre C++)"
-#: sphinx/domains/cpp.py:962
+#: sphinx/domains/cpp.py:990
#, python-format
msgid "%s (C++ function)"
msgstr "%s (fonction C++)"
-#: sphinx/domains/cpp.py:1030 sphinx/domains/python.py:499
+#: sphinx/domains/cpp.py:1059 sphinx/domains/javascript.py:163
+#: sphinx/domains/python.py:561
msgid "class"
msgstr "classe"
-#: sphinx/domains/javascript.py:117 sphinx/domains/python.py:221
+#: sphinx/domains/javascript.py:106 sphinx/domains/python.py:254
#, python-format
msgid "%s() (built-in function)"
msgstr "%s() (fonction de base)"
-#: sphinx/domains/javascript.py:118 sphinx/domains/python.py:285
+#: sphinx/domains/javascript.py:107 sphinx/domains/python.py:318
#, python-format
msgid "%s() (%s method)"
msgstr "%s() (méthode %s)"
-#: sphinx/domains/javascript.py:120
+#: sphinx/domains/javascript.py:109
+#, python-format
+msgid "%s() (class)"
+msgstr "%s() (classe)"
+
+#: sphinx/domains/javascript.py:111
#, python-format
msgid "%s (global variable or constant)"
msgstr "%s (variable globale ou constante)"
-#: sphinx/domains/javascript.py:122 sphinx/domains/python.py:323
+#: sphinx/domains/javascript.py:113 sphinx/domains/python.py:356
#, python-format
msgid "%s (%s attribute)"
msgstr "%s (attribut %s)"
-#: sphinx/domains/javascript.py:131
+#: sphinx/domains/javascript.py:122
#, fuzzy
msgid "Arguments"
msgstr "Paramètres"
-#: sphinx/domains/javascript.py:134
+#: sphinx/domains/javascript.py:125
msgid "Throws"
msgstr "Lance"
-#: sphinx/domains/javascript.py:167 sphinx/domains/python.py:498
+#: sphinx/domains/javascript.py:164 sphinx/domains/python.py:560
msgid "data"
msgstr "données"
-#: sphinx/domains/javascript.py:168 sphinx/domains/python.py:504
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:566
msgid "attribute"
msgstr "attribut"
-#: sphinx/domains/python.py:53
+#: sphinx/domains/python.py:100
#, fuzzy
msgid "Variables"
msgstr "Variable"
-#: sphinx/domains/python.py:56
+#: sphinx/domains/python.py:104
msgid "Raises"
msgstr "Lève"
-#: sphinx/domains/python.py:222 sphinx/domains/python.py:279
-#: sphinx/domains/python.py:291 sphinx/domains/python.py:304
+#: sphinx/domains/python.py:255 sphinx/domains/python.py:312
+#: sphinx/domains/python.py:324 sphinx/domains/python.py:337
#, python-format
msgid "%s() (in module %s)"
msgstr "%s() (dans le module %s)"
-#: sphinx/domains/python.py:225
+#: sphinx/domains/python.py:258
#, python-format
msgid "%s (built-in variable)"
msgstr "%s (variable de base)"
-#: sphinx/domains/python.py:226 sphinx/domains/python.py:317
+#: sphinx/domains/python.py:259 sphinx/domains/python.py:350
#, python-format
msgid "%s (in module %s)"
msgstr "%s (dans le module %s)"
-#: sphinx/domains/python.py:242
+#: sphinx/domains/python.py:275
#, python-format
msgid "%s (built-in class)"
msgstr "%s (classe de base)"
-#: sphinx/domains/python.py:243
+#: sphinx/domains/python.py:276
#, python-format
msgid "%s (class in %s)"
msgstr "%s (classe dans %s)"
-#: sphinx/domains/python.py:283
+#: sphinx/domains/python.py:316
#, python-format
msgid "%s() (%s.%s method)"
msgstr "%s() (méthode %s.%s)"
-#: sphinx/domains/python.py:295
+#: sphinx/domains/python.py:328
#, python-format
msgid "%s() (%s.%s static method)"
msgstr "%s() (méthode statique %s.%s)"
-#: sphinx/domains/python.py:298
+#: sphinx/domains/python.py:331
#, python-format
msgid "%s() (%s static method)"
msgstr "%s() (méthode statique %s)"
-#: sphinx/domains/python.py:308
+#: sphinx/domains/python.py:341
#, fuzzy, python-format
msgid "%s() (%s.%s class method)"
-msgstr "%s() (méthode %s.%s)"
+msgstr "%s() (méthode de classe %s.%s)"
-#: sphinx/domains/python.py:311
+#: sphinx/domains/python.py:344
#, fuzzy, python-format
msgid "%s() (%s class method)"
-msgstr "%s() (méthode %s)"
+msgstr "%s() (méthode de classe %s)"
-#: sphinx/domains/python.py:321
+#: sphinx/domains/python.py:354
#, python-format
msgid "%s (%s.%s attribute)"
msgstr "%s (attribut %s.%s)"
-#: sphinx/domains/python.py:366
-msgid "Platforms: "
-msgstr "Plateformes : "
-
-#: sphinx/domains/python.py:372
+#: sphinx/domains/python.py:434
#, python-format
msgid "%s (module)"
msgstr "%s (module)"
-#: sphinx/domains/python.py:429
+#: sphinx/domains/python.py:491
#, fuzzy
msgid "Python Module Index"
msgstr "Index du module"
-#: sphinx/domains/python.py:430
+#: sphinx/domains/python.py:492
msgid "modules"
msgstr "modules"
-#: sphinx/domains/python.py:475
+#: sphinx/domains/python.py:537
msgid "Deprecated"
msgstr "Obsolète"
-#: sphinx/domains/python.py:500 sphinx/locale/__init__.py:162
+#: sphinx/domains/python.py:562 sphinx/locale/__init__.py:179
msgid "exception"
msgstr "exception"
-#: sphinx/domains/python.py:501
+#: sphinx/domains/python.py:563
msgid "method"
msgstr "méthode"
-#: sphinx/domains/python.py:502
-#, fuzzy, python-format
+#: sphinx/domains/python.py:564
+#, fuzzy
msgid "class method"
-msgstr "%s() (méthode %s)"
+msgstr "méthode de classe"
-#: sphinx/domains/python.py:503
+#: sphinx/domains/python.py:565
msgid "static method"
msgstr "méthode statique"
-#: sphinx/domains/python.py:505 sphinx/locale/__init__.py:158
+#: sphinx/domains/python.py:567 sphinx/locale/__init__.py:175
msgid "module"
msgstr "module"
-#: sphinx/domains/rst.py:53
+#: sphinx/domains/python.py:695
+msgid " (deprecated)"
+msgstr " (obsolète)"
+
+#: sphinx/domains/rst.py:55
#, python-format
msgid "%s (directive)"
msgstr ""
-#: sphinx/domains/rst.py:55
-#, fuzzy, python-format
+#: sphinx/domains/rst.py:57
+#, python-format
msgid "%s (role)"
-msgstr "%s (module)"
+msgstr ""
-#: sphinx/domains/rst.py:103
+#: sphinx/domains/rst.py:106
msgid "directive"
msgstr ""
-#: sphinx/domains/rst.py:104
-#, fuzzy
+#: sphinx/domains/rst.py:107
msgid "role"
-msgstr "module"
+msgstr ""
-#: sphinx/domains/std.py:68 sphinx/domains/std.py:84
+#: sphinx/domains/std.py:70 sphinx/domains/std.py:86
#, python-format
msgid "environment variable; %s"
msgstr "variable d'environnement; %s"
-#: sphinx/domains/std.py:160
+#: sphinx/domains/std.py:162
#, python-format
msgid "%scommand line option; %s"
msgstr "%soption de ligne de commande; %s"
-#: sphinx/domains/std.py:328
+#: sphinx/domains/std.py:393
msgid "glossary term"
msgstr "terme du glossaire"
-#: sphinx/domains/std.py:329
+#: sphinx/domains/std.py:394
msgid "grammar token"
msgstr "élément de grammaire"
-#: sphinx/domains/std.py:330
+#: sphinx/domains/std.py:395
msgid "reference label"
msgstr "étiquette de référence"
-#: sphinx/domains/std.py:331
+#: sphinx/domains/std.py:396
msgid "environment variable"
msgstr "variable d'environnement"
-#: sphinx/domains/std.py:332
+#: sphinx/domains/std.py:397
msgid "program option"
msgstr "option du programme"
-#: sphinx/domains/std.py:360 sphinx/themes/basic/genindex-single.html:11
+#: sphinx/domains/std.py:427 sphinx/themes/basic/genindex-single.html:32
#: sphinx/themes/basic/genindex-split.html:11
#: sphinx/themes/basic/genindex-split.html:14
-#: sphinx/themes/basic/genindex.html:11 sphinx/themes/basic/genindex.html:14
-#: sphinx/themes/basic/genindex.html:50 sphinx/themes/basic/layout.html:125
-#: sphinx/writers/latex.py:173
+#: sphinx/themes/basic/genindex.html:32 sphinx/themes/basic/genindex.html:35
+#: sphinx/themes/basic/genindex.html:68 sphinx/themes/basic/layout.html:134
+#: sphinx/writers/latex.py:179 sphinx/writers/texinfo.py:456
msgid "Index"
msgstr "Index"
-#: sphinx/domains/std.py:361
+#: sphinx/domains/std.py:428
msgid "Module Index"
msgstr "Index du module"
-#: sphinx/domains/std.py:362 sphinx/themes/basic/defindex.html:25
+#: sphinx/domains/std.py:429 sphinx/themes/basic/defindex.html:25
msgid "Search Page"
msgstr "Page de recherche"
-#: sphinx/ext/autodoc.py:917
+#: sphinx/ext/autodoc.py:1002
#, python-format
msgid " Bases: %s"
msgstr ""
-#: sphinx/ext/autodoc.py:950
+#: sphinx/ext/autodoc.py:1038
#, python-format
msgid "alias of :class:`%s`"
msgstr "alias de :class:`%s`"
@@ -408,104 +428,104 @@ msgstr "(L'<<entrée orginale>> se trouve dans %s, à la ligne %d.)"
msgid "original entry"
msgstr "entrée orginale"
-#: sphinx/ext/viewcode.py:66
+#: sphinx/ext/viewcode.py:70
msgid "[source]"
msgstr ""
-#: sphinx/ext/viewcode.py:109
+#: sphinx/ext/viewcode.py:117
msgid "[docs]"
msgstr ""
-#: sphinx/ext/viewcode.py:123
+#: sphinx/ext/viewcode.py:131
#, fuzzy
msgid "Module code"
msgstr "module"
-#: sphinx/ext/viewcode.py:129
+#: sphinx/ext/viewcode.py:137
#, python-format
msgid "<h1>Source code for %s</h1>"
msgstr "<h1>Code source de %s</h1>"
-#: sphinx/ext/viewcode.py:156
+#: sphinx/ext/viewcode.py:164
msgid "Overview: module code"
msgstr "Vue d'ensemble : code du module"
-#: sphinx/ext/viewcode.py:157
+#: sphinx/ext/viewcode.py:165
msgid "<h1>All modules for which code is available</h1>"
msgstr "<h1>Modules pour lesquels le code est disponible</h1>"
-#: sphinx/locale/__init__.py:139
+#: sphinx/locale/__init__.py:155
msgid "Attention"
msgstr "Attention"
-#: sphinx/locale/__init__.py:140
+#: sphinx/locale/__init__.py:156
msgid "Caution"
msgstr "Prudence"
-#: sphinx/locale/__init__.py:141
+#: sphinx/locale/__init__.py:157
msgid "Danger"
msgstr "Danger"
-#: sphinx/locale/__init__.py:142
+#: sphinx/locale/__init__.py:158
msgid "Error"
msgstr "Erreur"
-#: sphinx/locale/__init__.py:143
+#: sphinx/locale/__init__.py:159
msgid "Hint"
msgstr "Indice"
-#: sphinx/locale/__init__.py:144
+#: sphinx/locale/__init__.py:160
msgid "Important"
msgstr "Important"
-#: sphinx/locale/__init__.py:145
+#: sphinx/locale/__init__.py:161
msgid "Note"
msgstr "Note"
-#: sphinx/locale/__init__.py:146
+#: sphinx/locale/__init__.py:162
msgid "See Also"
msgstr "Voir aussi"
-#: sphinx/locale/__init__.py:147
+#: sphinx/locale/__init__.py:163
msgid "Tip"
msgstr "Astuce"
-#: sphinx/locale/__init__.py:148
+#: sphinx/locale/__init__.py:164
msgid "Warning"
msgstr "Warning"
-#: sphinx/locale/__init__.py:152
+#: sphinx/locale/__init__.py:168
#, python-format
msgid "New in version %s"
msgstr "Introduit dans la version %s"
-#: sphinx/locale/__init__.py:153
+#: sphinx/locale/__init__.py:169
#, python-format
msgid "Changed in version %s"
msgstr "Modifié dans la version %s"
-#: sphinx/locale/__init__.py:154
+#: sphinx/locale/__init__.py:170
#, python-format
msgid "Deprecated since version %s"
msgstr "Obsolète depuis la version %s"
-#: sphinx/locale/__init__.py:159
+#: sphinx/locale/__init__.py:176
msgid "keyword"
msgstr "mot-clé"
-#: sphinx/locale/__init__.py:160
+#: sphinx/locale/__init__.py:177
msgid "operator"
msgstr "opérateur"
-#: sphinx/locale/__init__.py:161
+#: sphinx/locale/__init__.py:178
msgid "object"
msgstr "objet"
-#: sphinx/locale/__init__.py:163
+#: sphinx/locale/__init__.py:180
msgid "statement"
msgstr "état"
-#: sphinx/locale/__init__.py:164
+#: sphinx/locale/__init__.py:181
msgid "built-in function"
msgstr "fonction de base"
@@ -514,8 +534,8 @@ msgstr "fonction de base"
msgid "Table Of Contents"
msgstr "Table des matières"
-#: sphinx/themes/agogo/layout.html:49 sphinx/themes/basic/layout.html:128
-#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:14
+#: sphinx/themes/agogo/layout.html:49 sphinx/themes/basic/layout.html:137
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:20
msgid "Search"
msgstr "Recherche"
@@ -564,15 +584,15 @@ msgstr "accès rapide à l'ensemble des modules"
msgid "all functions, classes, terms"
msgstr "toutes les fonctions, classes, termes"
-#: sphinx/themes/basic/genindex-single.html:14
+#: sphinx/themes/basic/genindex-single.html:35
#, python-format
msgid "Index &ndash; %(key)s"
msgstr "Index &ndash; %(key)s"
-#: sphinx/themes/basic/genindex-single.html:46
+#: sphinx/themes/basic/genindex-single.html:63
#: sphinx/themes/basic/genindex-split.html:24
#: sphinx/themes/basic/genindex-split.html:38
-#: sphinx/themes/basic/genindex.html:56
+#: sphinx/themes/basic/genindex.html:74
msgid "Full index on one page"
msgstr "Index complet sur une seule page"
@@ -584,39 +604,39 @@ msgstr "Indexer les pages par lettre"
msgid "can be huge"
msgstr "peut être énorme"
-#: sphinx/themes/basic/layout.html:23
+#: sphinx/themes/basic/layout.html:29
msgid "Navigation"
msgstr "Navigation"
-#: sphinx/themes/basic/layout.html:113
+#: sphinx/themes/basic/layout.html:122
#, python-format
msgid "Search within %(docstitle)s"
msgstr "Recherchez dans %(docstitle)s"
-#: sphinx/themes/basic/layout.html:122
+#: sphinx/themes/basic/layout.html:131
msgid "About these documents"
msgstr "À propos de ces documents"
-#: sphinx/themes/basic/layout.html:131
+#: sphinx/themes/basic/layout.html:140
msgid "Copyright"
msgstr "Copyright"
-#: sphinx/themes/basic/layout.html:180
+#: sphinx/themes/basic/layout.html:189
#, python-format
msgid "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
msgstr "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
-#: sphinx/themes/basic/layout.html:182
+#: sphinx/themes/basic/layout.html:191
#, python-format
msgid "&copy; Copyright %(copyright)s."
msgstr "&copy; Copyright %(copyright)s."
-#: sphinx/themes/basic/layout.html:186
+#: sphinx/themes/basic/layout.html:195
#, python-format
msgid "Last updated on %(last_updated)s."
msgstr "Mis à jour le %(last_updated)s."
-#: sphinx/themes/basic/layout.html:189
+#: sphinx/themes/basic/layout.html:198
#, python-format
msgid ""
"Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
@@ -646,13 +666,13 @@ msgstr "Sujet suivant"
msgid "next chapter"
msgstr "Chapitre suivant"
-#: sphinx/themes/basic/search.html:18
+#: sphinx/themes/basic/search.html:24
msgid ""
"Please activate JavaScript to enable the search\n"
" functionality."
msgstr "Activez le JavaScript pour que la recherche fonctionne."
-#: sphinx/themes/basic/search.html:23
+#: sphinx/themes/basic/search.html:29
#, fuzzy
msgid ""
"From here you can search these documents. Enter your search\n"
@@ -668,16 +688,15 @@ msgstr ""
" contenant moins de mots n'apparaîtront pas dans la liste des "
"résultats."
-#: sphinx/themes/basic/search.html:30
+#: sphinx/themes/basic/search.html:36
msgid "search"
msgstr "rechercher"
-#: sphinx/themes/basic/search.html:34
-#: sphinx/themes/basic/static/searchtools.js:489
+#: sphinx/themes/basic/search.html:40
msgid "Search Results"
msgstr "Résultats de la recherche"
-#: sphinx/themes/basic/search.html:36
+#: sphinx/themes/basic/search.html:42
msgid "Your search did not match any results."
msgstr "Votre recherche n'a retourné aucun résultat"
@@ -717,12 +736,12 @@ msgstr "Modifications de l'API C"
msgid "Other changes"
msgstr "Autres modifications"
-#: sphinx/themes/basic/static/doctools.js:154 sphinx/writers/html.py:482
-#: sphinx/writers/html.py:487
+#: sphinx/themes/basic/static/doctools.js:154 sphinx/writers/html.py:504
+#: sphinx/writers/html.py:510
msgid "Permalink to this headline"
msgstr "Lien permanent vers ce titre"
-#: sphinx/themes/basic/static/doctools.js:160 sphinx/writers/html.py:87
+#: sphinx/themes/basic/static/doctools.js:160 sphinx/writers/html.py:92
msgid "Permalink to this definition"
msgstr "Lien permanent vers cette définition"
@@ -730,38 +749,12 @@ msgstr "Lien permanent vers cette définition"
msgid "Hide Search Matches"
msgstr "Cacher les résultats de la recherche"
-#: sphinx/themes/basic/static/searchtools.js:285
-msgid "Searching"
-msgstr "En cours de recherche"
-
-#: sphinx/themes/basic/static/searchtools.js:290
-msgid "Preparing search..."
-msgstr "Préparation de la recherche..."
-
-#: sphinx/themes/basic/static/searchtools.js:364
-msgid ", in "
-msgstr ", dans"
-
-#: sphinx/themes/basic/static/searchtools.js:491
-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 ""
-"Votre recherche ne correspond à aucun document. Vérifiez l'orthographe "
-"des termes de recherche et que vous avez sélectionné suffisamment de "
-"catégories."
-
-#: sphinx/themes/basic/static/searchtools.js:493
-#, python-format
-msgid "Search finished, found %s page(s) matching the search query."
-msgstr "La recherche est terminée, %s page(s) correspond(ent) à la requête."
-
-#: sphinx/themes/default/static/sidebar.js:66
+#: sphinx/themes/default/static/sidebar.js:69
msgid "Expand sidebar"
msgstr "Agrandir le menu"
-#: sphinx/themes/default/static/sidebar.js:79
-#: sphinx/themes/default/static/sidebar.js:106
+#: sphinx/themes/default/static/sidebar.js:82
+#: sphinx/themes/default/static/sidebar.js:110
msgid "Collapse sidebar"
msgstr "Réduire le menu"
@@ -769,36 +762,25 @@ msgstr "Réduire le menu"
msgid "Contents"
msgstr "Contenu"
-#: sphinx/writers/latex.py:171
+#: sphinx/writers/latex.py:177
msgid "Release"
msgstr "Version"
-#: sphinx/writers/latex.py:572 sphinx/writers/manpage.py:178
+#: sphinx/writers/latex.py:594 sphinx/writers/manpage.py:182
+#: sphinx/writers/texinfo.py:589
msgid "Footnotes"
msgstr "Notes de bas de page"
-#: sphinx/writers/latex.py:641
+#: sphinx/writers/latex.py:676
msgid "continued from previous page"
msgstr "Suite de la page précédente"
-#: sphinx/writers/latex.py:646
+#: sphinx/writers/latex.py:681
#, fuzzy
msgid "Continued on next page"
msgstr "Suite sur la page suivante"
-#: sphinx/writers/text.py:422
+#: sphinx/writers/text.py:437
msgid "[image]"
msgstr "[image]"
-#~ msgid "Parameter"
-#~ msgstr "Paramètres"
-
-#~ msgid "here"
-#~ msgstr "ici"
-
-#~ msgid "module, in "
-#~ msgstr "module, dans"
-
-#~ msgid "Platform: %s"
-#~ msgstr "Plateforme : %s"
-
diff --git a/sphinx/locale/hr/LC_MESSAGES/sphinx.js b/sphinx/locale/hr/LC_MESSAGES/sphinx.js
index b9d1f7af..d4284716 100644
--- a/sphinx/locale/hr/LC_MESSAGES/sphinx.js
+++ b/sphinx/locale/hr/LC_MESSAGES/sphinx.js
@@ -1 +1 @@
-Documentation.addTranslations({"locale": "hr", "plural_expr": "0", "messages": {"Search Results": "Rezultati pretrage", "Preparing search...": "Pripremam pretra\u017eivanje...", "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "Za va\u0161u pretragu nema rezultata. Molimo pregledajte da li so sve rije\u010di ispravno napisane i da li ste izbrali dovoljno kategorija.", "Search finished, found %s page(s) matching the search query.": "Pretra\u017eivanje je zaklju\u010deno, prona\u0111eno %s stranica, koje odgovaraju tra\u017eenom nizu.", ", in ": ", u ", "Expand sidebar": "", "Permalink to this headline": "Link na taj naslov", "Searching": "Tra\u017eim", "Collapse sidebar": "", "Permalink to this definition": "Link na tu definiciju", "Hide Search Matches": "Sakrij rezultate pretrage"}}); \ No newline at end of file
+Documentation.addTranslations({"locale": "hr", "plural_expr": "0", "messages": {"Hide Search Matches": "Sakrij rezultate pretrage", "Permalink to this definition": "Link na tu definiciju", "Expand sidebar": "", "Permalink to this headline": "Link na taj naslov", "Collapse sidebar": ""}}); \ No newline at end of file
diff --git a/sphinx/locale/hr/LC_MESSAGES/sphinx.mo b/sphinx/locale/hr/LC_MESSAGES/sphinx.mo
index e032adeb..a9bdb145 100644
--- a/sphinx/locale/hr/LC_MESSAGES/sphinx.mo
+++ b/sphinx/locale/hr/LC_MESSAGES/sphinx.mo
Binary files differ
diff --git a/sphinx/locale/hr/LC_MESSAGES/sphinx.po b/sphinx/locale/hr/LC_MESSAGES/sphinx.po
index ddcf2299..15e70346 100644
--- a/sphinx/locale/hr/LC_MESSAGES/sphinx.po
+++ b/sphinx/locale/hr/LC_MESSAGES/sphinx.po
@@ -3,388 +3,406 @@ msgid ""
msgstr ""
"Project-Id-Version: Sphinx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2010-09-11 23:58+0200\n"
-"PO-Revision-Date: 2010-05-24 23:54+0200\n"
+"POT-Creation-Date: 2011-09-21 10:06+0200\n"
+"PO-Revision-Date: 2011-01-22 14:41+0100\n"
"Last-Translator: Bojan Mihelač <bmihelac@mihelac.org>\n"
"Language-Team: Bojan Mihelač <bmihelac@mihelac.org>\n"
"Plural-Forms: nplurals=1; plural=0\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"
+"Generated-By: Babel 0.9.6\n"
-#: sphinx/environment.py:106 sphinx/writers/latex.py:184
-#: sphinx/writers/manpage.py:67
+#: sphinx/config.py:81
+#, python-format
+msgid "%s %s documentation"
+msgstr ""
+
+#: sphinx/environment.py:119 sphinx/writers/latex.py:190
+#: sphinx/writers/manpage.py:67 sphinx/writers/texinfo.py:203
#, python-format
msgid "%B %d, %Y"
msgstr "%d %B, %Y"
-#: sphinx/roles.py:174
+#: sphinx/environment.py:1625
+#, fuzzy, python-format
+msgid "see %s"
+msgstr "pogledaj %s"
+
+#: sphinx/environment.py:1628
+#, fuzzy, python-format
+msgid "see also %s"
+msgstr "pogledaj i %s"
+
+#: sphinx/roles.py:175
#, python-format
-msgid "Python Enhancement Proposals!PEP %s"
-msgstr "Python Enhancement Proposals!PEP %s"
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr "Python Enhancement Proposals; PEP %s"
-#: sphinx/builders/changes.py:72
+#: sphinx/builders/changes.py:73
msgid "Builtins"
msgstr "Ugrađeni dijelovi"
-#: sphinx/builders/changes.py:74
+#: sphinx/builders/changes.py:75
msgid "Module level"
msgstr "Nivo modula"
-#: sphinx/builders/html.py:266
+#: sphinx/builders/html.py:274
#, python-format
msgid "%b %d, %Y"
msgstr "%d %b, %Y"
-#: sphinx/builders/html.py:285 sphinx/themes/basic/defindex.html:30
+#: sphinx/builders/html.py:293 sphinx/themes/basic/defindex.html:30
msgid "General Index"
msgstr "Opceniti abecedni indeks"
-#: sphinx/builders/html.py:285
+#: sphinx/builders/html.py:293
msgid "index"
msgstr "abecedni indeks"
-#: sphinx/builders/html.py:345
+#: sphinx/builders/html.py:353
msgid "next"
msgstr "naprijed"
-#: sphinx/builders/html.py:354
+#: sphinx/builders/html.py:362
msgid "previous"
msgstr "nazad"
-#: sphinx/builders/latex.py:151
+#: sphinx/builders/latex.py:141 sphinx/builders/texinfo.py:196
msgid " (in "
msgstr " (u "
-#: sphinx/directives/other.py:127
+#: sphinx/directives/other.py:136
msgid "Section author: "
-msgstr "Autor sekcije:"
+msgstr "Autor sekcije: "
-#: sphinx/directives/other.py:129
+#: sphinx/directives/other.py:138
msgid "Module author: "
-msgstr "Autor modula:"
+msgstr "Autor modula: "
-#: sphinx/directives/other.py:131
+#: sphinx/directives/other.py:140
#, fuzzy
msgid "Code author: "
-msgstr "Autor modula:"
+msgstr "Autor modula: "
-#: sphinx/directives/other.py:133
+#: sphinx/directives/other.py:142
msgid "Author: "
msgstr "Autor:"
-#: sphinx/directives/other.py:238
+#: sphinx/directives/other.py:215
msgid "See also"
msgstr "Pogledaj i"
-#: sphinx/domains/__init__.py:253
+#: sphinx/domains/__init__.py:244
#, python-format
msgid "%s %s"
msgstr ""
-#: sphinx/domains/c.py:51 sphinx/domains/python.py:49
+#: sphinx/domains/c.py:51 sphinx/domains/python.py:95
msgid "Parameters"
msgstr "Parametri"
-#: sphinx/domains/c.py:54 sphinx/domains/javascript.py:137
-#: sphinx/domains/python.py:59
+#: sphinx/domains/c.py:54 sphinx/domains/javascript.py:128
+#: sphinx/domains/python.py:107
msgid "Returns"
msgstr "Vraća"
-#: sphinx/domains/c.py:56 sphinx/domains/python.py:61
+#: sphinx/domains/c.py:56 sphinx/domains/python.py:109
msgid "Return type"
msgstr "Vraća tip"
-#: sphinx/domains/c.py:133
+#: sphinx/domains/c.py:141
#, python-format
msgid "%s (C function)"
msgstr "%s (C funkcija)"
-#: sphinx/domains/c.py:135
+#: sphinx/domains/c.py:143
#, python-format
msgid "%s (C member)"
msgstr "%s (C član)"
-#: sphinx/domains/c.py:137
+#: sphinx/domains/c.py:145
#, python-format
msgid "%s (C macro)"
msgstr "%s (C makro)"
-#: sphinx/domains/c.py:139
+#: sphinx/domains/c.py:147
#, python-format
msgid "%s (C type)"
msgstr "%s (C tip)"
-#: sphinx/domains/c.py:141
+#: sphinx/domains/c.py:149
#, python-format
msgid "%s (C variable)"
msgstr "%s (C varijabla)"
-#: sphinx/domains/c.py:171 sphinx/domains/cpp.py:1031
-#: sphinx/domains/javascript.py:166 sphinx/domains/python.py:497
+#: sphinx/domains/c.py:204 sphinx/domains/cpp.py:1060
+#: sphinx/domains/javascript.py:162 sphinx/domains/python.py:559
msgid "function"
msgstr "funkcija"
-#: sphinx/domains/c.py:172 sphinx/domains/cpp.py:1032
+#: sphinx/domains/c.py:205 sphinx/domains/cpp.py:1061
msgid "member"
msgstr "član"
-#: sphinx/domains/c.py:173
+#: sphinx/domains/c.py:206
msgid "macro"
msgstr ""
-#: sphinx/domains/c.py:174 sphinx/domains/cpp.py:1033
+#: sphinx/domains/c.py:207 sphinx/domains/cpp.py:1062
msgid "type"
msgstr "tip"
-#: sphinx/domains/c.py:175
+#: sphinx/domains/c.py:208
#, fuzzy
msgid "variable"
msgstr "Varijabla"
-#: sphinx/domains/cpp.py:876
+#: sphinx/domains/cpp.py:904
#, python-format
msgid "%s (C++ class)"
msgstr "%s (C++ razred)"
-#: sphinx/domains/cpp.py:891
+#: sphinx/domains/cpp.py:919
#, python-format
msgid "%s (C++ type)"
msgstr "%s (C++ tip)"
-#: sphinx/domains/cpp.py:910
+#: sphinx/domains/cpp.py:938
#, python-format
msgid "%s (C++ member)"
msgstr "%s (C++ član)"
-#: sphinx/domains/cpp.py:962
+#: sphinx/domains/cpp.py:990
#, python-format
msgid "%s (C++ function)"
msgstr "%s (C++ funkcija)"
-#: sphinx/domains/cpp.py:1030 sphinx/domains/python.py:499
-#, fuzzy
+#: sphinx/domains/cpp.py:1059 sphinx/domains/javascript.py:163
+#: sphinx/domains/python.py:561
msgid "class"
msgstr "razred"
-#: sphinx/domains/javascript.py:117 sphinx/domains/python.py:221
+#: sphinx/domains/javascript.py:106 sphinx/domains/python.py:254
#, python-format
msgid "%s() (built-in function)"
msgstr "%s() (ugrađene funkcije)"
-#: sphinx/domains/javascript.py:118 sphinx/domains/python.py:285
+#: sphinx/domains/javascript.py:107 sphinx/domains/python.py:318
#, python-format
msgid "%s() (%s method)"
msgstr "%s() (%s metoda)"
-#: sphinx/domains/javascript.py:120
+#: sphinx/domains/javascript.py:109
+#, python-format
+msgid "%s() (class)"
+msgstr "%s() (razred)"
+
+#: sphinx/domains/javascript.py:111
#, python-format
msgid "%s (global variable or constant)"
msgstr ""
-#: sphinx/domains/javascript.py:122 sphinx/domains/python.py:323
+#: sphinx/domains/javascript.py:113 sphinx/domains/python.py:356
#, python-format
msgid "%s (%s attribute)"
msgstr "%s (%s atribut)"
-#: sphinx/domains/javascript.py:131
+#: sphinx/domains/javascript.py:122
#, fuzzy
msgid "Arguments"
msgstr "Parametri"
-#: sphinx/domains/javascript.py:134
+#: sphinx/domains/javascript.py:125
msgid "Throws"
msgstr ""
-#: sphinx/domains/javascript.py:167 sphinx/domains/python.py:498
+#: sphinx/domains/javascript.py:164 sphinx/domains/python.py:560
msgid "data"
msgstr ""
-#: sphinx/domains/javascript.py:168 sphinx/domains/python.py:504
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:566
msgid "attribute"
msgstr "atribut"
-#: sphinx/domains/python.py:53
+#: sphinx/domains/python.py:100
#, fuzzy
msgid "Variables"
msgstr "Varijabla"
-#: sphinx/domains/python.py:56
+#: sphinx/domains/python.py:104
msgid "Raises"
msgstr "Podiže"
-#: sphinx/domains/python.py:222 sphinx/domains/python.py:279
-#: sphinx/domains/python.py:291 sphinx/domains/python.py:304
+#: sphinx/domains/python.py:255 sphinx/domains/python.py:312
+#: sphinx/domains/python.py:324 sphinx/domains/python.py:337
#, python-format
msgid "%s() (in module %s)"
msgstr "%s() (u modulu %s)"
-#: sphinx/domains/python.py:225
+#: sphinx/domains/python.py:258
#, python-format
msgid "%s (built-in variable)"
msgstr "%s (ugrađene variable)"
-#: sphinx/domains/python.py:226 sphinx/domains/python.py:317
+#: sphinx/domains/python.py:259 sphinx/domains/python.py:350
#, python-format
msgid "%s (in module %s)"
msgstr "%s (u modulu %s)"
-#: sphinx/domains/python.py:242
+#: sphinx/domains/python.py:275
#, python-format
msgid "%s (built-in class)"
msgstr "%s (ugrađen razred)"
-#: sphinx/domains/python.py:243
+#: sphinx/domains/python.py:276
#, python-format
msgid "%s (class in %s)"
msgstr "%s (razred u %s)"
-#: sphinx/domains/python.py:283
+#: sphinx/domains/python.py:316
#, python-format
msgid "%s() (%s.%s method)"
msgstr "%s() (%s.%s metoda)"
-#: sphinx/domains/python.py:295
+#: sphinx/domains/python.py:328
#, python-format
msgid "%s() (%s.%s static method)"
msgstr "%s() (%s.%s statična metoda)"
-#: sphinx/domains/python.py:298
+#: sphinx/domains/python.py:331
#, python-format
msgid "%s() (%s static method)"
msgstr "%s() (%s statična metoda)"
-#: sphinx/domains/python.py:308
+#: sphinx/domains/python.py:341
#, fuzzy, python-format
msgid "%s() (%s.%s class method)"
msgstr "%s() (%s.%s metoda)"
-#: sphinx/domains/python.py:311
+#: sphinx/domains/python.py:344
#, fuzzy, python-format
msgid "%s() (%s class method)"
msgstr "%s() (%s metoda)"
-#: sphinx/domains/python.py:321
+#: sphinx/domains/python.py:354
#, python-format
msgid "%s (%s.%s attribute)"
msgstr "%s (%s.%s atribut)"
-#: sphinx/domains/python.py:366
-msgid "Platforms: "
-msgstr "Platforme:"
-
-#: sphinx/domains/python.py:372
+#: sphinx/domains/python.py:434
#, python-format
msgid "%s (module)"
msgstr "%s (modul)"
-#: sphinx/domains/python.py:429
+#: sphinx/domains/python.py:491
#, fuzzy
msgid "Python Module Index"
msgstr "Popis modula"
-#: sphinx/domains/python.py:430
+#: sphinx/domains/python.py:492
msgid "modules"
msgstr "Moduli"
-#: sphinx/domains/python.py:475
+#: sphinx/domains/python.py:537
msgid "Deprecated"
msgstr "Zastarjelo"
-#: sphinx/domains/python.py:500 sphinx/locale/__init__.py:162
+#: sphinx/domains/python.py:562 sphinx/locale/__init__.py:179
msgid "exception"
msgstr "izuzetak"
-#: sphinx/domains/python.py:501
+#: sphinx/domains/python.py:563
msgid "method"
msgstr ""
-#: sphinx/domains/python.py:502
-#, fuzzy, python-format
+#: sphinx/domains/python.py:564
msgid "class method"
-msgstr "%s() (%s metoda)"
+msgstr ""
-#: sphinx/domains/python.py:503
+#: sphinx/domains/python.py:565
msgid "static method"
msgstr "statična metoda"
-#: sphinx/domains/python.py:505 sphinx/locale/__init__.py:158
+#: sphinx/domains/python.py:567 sphinx/locale/__init__.py:175
msgid "module"
msgstr "modul"
-#: sphinx/domains/rst.py:53
+#: sphinx/domains/python.py:695
+msgid " (deprecated)"
+msgstr " (zastarjelo)"
+
+#: sphinx/domains/rst.py:55
#, python-format
msgid "%s (directive)"
msgstr ""
-#: sphinx/domains/rst.py:55
-#, fuzzy, python-format
+#: sphinx/domains/rst.py:57
+#, python-format
msgid "%s (role)"
-msgstr "%s (modul)"
+msgstr ""
-#: sphinx/domains/rst.py:103
+#: sphinx/domains/rst.py:106
msgid "directive"
msgstr ""
-#: sphinx/domains/rst.py:104
-#, fuzzy
+#: sphinx/domains/rst.py:107
msgid "role"
-msgstr "modul"
+msgstr ""
-#: sphinx/domains/std.py:68 sphinx/domains/std.py:84
+#: sphinx/domains/std.py:70 sphinx/domains/std.py:86
#, python-format
msgid "environment variable; %s"
msgstr "varijabla okruženja; %s"
-#: sphinx/domains/std.py:160
+#: sphinx/domains/std.py:162
#, python-format
msgid "%scommand line option; %s"
msgstr "%scommand line parameter; %s"
-#: sphinx/domains/std.py:328
+#: sphinx/domains/std.py:393
msgid "glossary term"
msgstr ""
-#: sphinx/domains/std.py:329
+#: sphinx/domains/std.py:394
msgid "grammar token"
msgstr ""
-#: sphinx/domains/std.py:330
+#: sphinx/domains/std.py:395
msgid "reference label"
msgstr ""
-#: sphinx/domains/std.py:331
+#: sphinx/domains/std.py:396
msgid "environment variable"
msgstr "varijabla okruženja"
-#: sphinx/domains/std.py:332
+#: sphinx/domains/std.py:397
msgid "program option"
msgstr ""
-#: sphinx/domains/std.py:360 sphinx/themes/basic/genindex-single.html:11
+#: sphinx/domains/std.py:427 sphinx/themes/basic/genindex-single.html:32
#: sphinx/themes/basic/genindex-split.html:11
#: sphinx/themes/basic/genindex-split.html:14
-#: sphinx/themes/basic/genindex.html:11 sphinx/themes/basic/genindex.html:14
-#: sphinx/themes/basic/genindex.html:50 sphinx/themes/basic/layout.html:125
-#: sphinx/writers/latex.py:173
+#: sphinx/themes/basic/genindex.html:32 sphinx/themes/basic/genindex.html:35
+#: sphinx/themes/basic/genindex.html:68 sphinx/themes/basic/layout.html:134
+#: sphinx/writers/latex.py:179 sphinx/writers/texinfo.py:456
msgid "Index"
msgstr "Abecedni popis"
-#: sphinx/domains/std.py:361
+#: sphinx/domains/std.py:428
msgid "Module Index"
msgstr "Popis modula"
-#: sphinx/domains/std.py:362 sphinx/themes/basic/defindex.html:25
+#: sphinx/domains/std.py:429 sphinx/themes/basic/defindex.html:25
msgid "Search Page"
msgstr "Tražilica"
-#: sphinx/ext/autodoc.py:917
+#: sphinx/ext/autodoc.py:1002
#, python-format
msgid " Bases: %s"
msgstr " Osnove: %s"
-#: sphinx/ext/autodoc.py:950
+#: sphinx/ext/autodoc.py:1038
#, python-format
msgid "alias of :class:`%s`"
msgstr "nadimak za :class:`%s`"
@@ -396,110 +414,110 @@ msgstr "Todo"
#: sphinx/ext/todo.py:109
#, fuzzy, python-format
msgid "(The <<original entry>> is located in %s, line %d.)"
-msgstr "(Originalan unos se nalazi u %s, u retku %d, i može biti pronađen "
+msgstr "(Originalan unos se nalazi u %s, u retku %d.)"
#: sphinx/ext/todo.py:117
msgid "original entry"
msgstr ""
-#: sphinx/ext/viewcode.py:66
+#: sphinx/ext/viewcode.py:70
msgid "[source]"
msgstr ""
-#: sphinx/ext/viewcode.py:109
+#: sphinx/ext/viewcode.py:117
msgid "[docs]"
msgstr ""
-#: sphinx/ext/viewcode.py:123
+#: sphinx/ext/viewcode.py:131
#, fuzzy
msgid "Module code"
msgstr "modul"
-#: sphinx/ext/viewcode.py:129
+#: sphinx/ext/viewcode.py:137
#, python-format
msgid "<h1>Source code for %s</h1>"
msgstr ""
-#: sphinx/ext/viewcode.py:156
+#: sphinx/ext/viewcode.py:164
msgid "Overview: module code"
msgstr ""
-#: sphinx/ext/viewcode.py:157
+#: sphinx/ext/viewcode.py:165
msgid "<h1>All modules for which code is available</h1>"
msgstr ""
-#: sphinx/locale/__init__.py:139
+#: sphinx/locale/__init__.py:155
msgid "Attention"
msgstr "Pozor"
-#: sphinx/locale/__init__.py:140
+#: sphinx/locale/__init__.py:156
msgid "Caution"
msgstr "Pažnja"
-#: sphinx/locale/__init__.py:141
+#: sphinx/locale/__init__.py:157
msgid "Danger"
msgstr "Opasnost"
-#: sphinx/locale/__init__.py:142
+#: sphinx/locale/__init__.py:158
msgid "Error"
msgstr "Greška"
-#: sphinx/locale/__init__.py:143
+#: sphinx/locale/__init__.py:159
msgid "Hint"
msgstr "Savjet"
-#: sphinx/locale/__init__.py:144
+#: sphinx/locale/__init__.py:160
msgid "Important"
msgstr "Važno"
-#: sphinx/locale/__init__.py:145
+#: sphinx/locale/__init__.py:161
msgid "Note"
msgstr "Napomena"
-#: sphinx/locale/__init__.py:146
+#: sphinx/locale/__init__.py:162
msgid "See Also"
msgstr "Pogledaj i"
-#: sphinx/locale/__init__.py:147
+#: sphinx/locale/__init__.py:163
msgid "Tip"
msgstr "Savjet"
-#: sphinx/locale/__init__.py:148
+#: sphinx/locale/__init__.py:164
msgid "Warning"
msgstr "Upozorenje"
-#: sphinx/locale/__init__.py:152
+#: sphinx/locale/__init__.py:168
#, python-format
msgid "New in version %s"
msgstr "Novo u verziji %s"
-#: sphinx/locale/__init__.py:153
+#: sphinx/locale/__init__.py:169
#, python-format
msgid "Changed in version %s"
msgstr "Promijenjeno u verziji %s"
-#: sphinx/locale/__init__.py:154
+#: sphinx/locale/__init__.py:170
#, python-format
msgid "Deprecated since version %s"
msgstr "Zastarijelo od verzije %s"
-#: sphinx/locale/__init__.py:159
+#: sphinx/locale/__init__.py:176
msgid "keyword"
msgstr "ključna riječ"
-#: sphinx/locale/__init__.py:160
+#: sphinx/locale/__init__.py:177
msgid "operator"
msgstr "operator"
-#: sphinx/locale/__init__.py:161
+#: sphinx/locale/__init__.py:178
msgid "object"
msgstr "objekt"
-#: sphinx/locale/__init__.py:163
+#: sphinx/locale/__init__.py:180
msgid "statement"
msgstr "izjava"
-#: sphinx/locale/__init__.py:164
+#: sphinx/locale/__init__.py:181
msgid "built-in function"
msgstr "ugrađen funkcije"
@@ -508,8 +526,8 @@ msgstr "ugrađen funkcije"
msgid "Table Of Contents"
msgstr "Pregled sadržaja"
-#: sphinx/themes/agogo/layout.html:49 sphinx/themes/basic/layout.html:128
-#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:14
+#: sphinx/themes/agogo/layout.html:49 sphinx/themes/basic/layout.html:137
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:20
msgid "Search"
msgstr "Traži"
@@ -557,15 +575,15 @@ msgstr "brz dostup do svih modulov"
msgid "all functions, classes, terms"
msgstr "sve funkcije, razredi, izrazi"
-#: sphinx/themes/basic/genindex-single.html:14
+#: sphinx/themes/basic/genindex-single.html:35
#, python-format
msgid "Index &ndash; %(key)s"
msgstr "Index &ndash; %(key)s"
-#: sphinx/themes/basic/genindex-single.html:46
+#: sphinx/themes/basic/genindex-single.html:63
#: sphinx/themes/basic/genindex-split.html:24
#: sphinx/themes/basic/genindex-split.html:38
-#: sphinx/themes/basic/genindex.html:56
+#: sphinx/themes/basic/genindex.html:74
msgid "Full index on one page"
msgstr "Potpun indeks na jednoj strani"
@@ -577,39 +595,39 @@ msgstr "Indeksiraj stranice po slovu"
msgid "can be huge"
msgstr "može biti veliko"
-#: sphinx/themes/basic/layout.html:23
+#: sphinx/themes/basic/layout.html:29
msgid "Navigation"
msgstr "Navigacija"
-#: sphinx/themes/basic/layout.html:113
+#: sphinx/themes/basic/layout.html:122
#, python-format
msgid "Search within %(docstitle)s"
msgstr "Traži između %(docstitle)s"
-#: sphinx/themes/basic/layout.html:122
+#: sphinx/themes/basic/layout.html:131
msgid "About these documents"
msgstr "O ovim dokumentima"
-#: sphinx/themes/basic/layout.html:131
+#: sphinx/themes/basic/layout.html:140
msgid "Copyright"
msgstr "Sva prava zadržana"
-#: sphinx/themes/basic/layout.html:180
+#: sphinx/themes/basic/layout.html:189
#, python-format
msgid "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
msgstr "&copy; <a href=\"%(path)s\">Sva prava zadržana</a> %(copyright)s."
-#: sphinx/themes/basic/layout.html:182
+#: sphinx/themes/basic/layout.html:191
#, python-format
msgid "&copy; Copyright %(copyright)s."
msgstr "&copy; Sva prava zadržana %(copyright)s."
-#: sphinx/themes/basic/layout.html:186
+#: sphinx/themes/basic/layout.html:195
#, python-format
msgid "Last updated on %(last_updated)s."
msgstr "Zadnji put ažurirano %(last_updated)s."
-#: sphinx/themes/basic/layout.html:189
+#: sphinx/themes/basic/layout.html:198
#, python-format
msgid ""
"Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
@@ -639,7 +657,7 @@ msgstr "Slijedeća tema"
msgid "next chapter"
msgstr "slijedeće poglavje"
-#: sphinx/themes/basic/search.html:18
+#: sphinx/themes/basic/search.html:24
msgid ""
"Please activate JavaScript to enable the search\n"
" functionality."
@@ -647,7 +665,7 @@ msgstr ""
"Molimo omogućite JavaScript\n"
" za djelovanje tražilice."
-#: sphinx/themes/basic/search.html:23
+#: sphinx/themes/basic/search.html:29
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"
@@ -659,16 +677,15 @@ msgstr ""
" function will automatically search for all of the words. Pages\n"
" containing fewer words won't appear in the result list."
-#: sphinx/themes/basic/search.html:30
+#: sphinx/themes/basic/search.html:36
msgid "search"
msgstr "traži"
-#: sphinx/themes/basic/search.html:34
-#: sphinx/themes/basic/static/searchtools.js:489
+#: sphinx/themes/basic/search.html:40
msgid "Search Results"
msgstr "Rezultati pretrage"
-#: sphinx/themes/basic/search.html:36
+#: sphinx/themes/basic/search.html:42
msgid "Your search did not match any results."
msgstr "Your search did not match any results."
@@ -708,12 +725,12 @@ msgstr "C API changes"
msgid "Other changes"
msgstr "Ostale promjene"
-#: sphinx/themes/basic/static/doctools.js:154 sphinx/writers/html.py:482
-#: sphinx/writers/html.py:487
+#: sphinx/themes/basic/static/doctools.js:154 sphinx/writers/html.py:504
+#: sphinx/writers/html.py:510
msgid "Permalink to this headline"
msgstr "Link na taj naslov"
-#: sphinx/themes/basic/static/doctools.js:160 sphinx/writers/html.py:87
+#: sphinx/themes/basic/static/doctools.js:160 sphinx/writers/html.py:92
msgid "Permalink to this definition"
msgstr "Link na tu definiciju"
@@ -721,39 +738,12 @@ msgstr "Link na tu definiciju"
msgid "Hide Search Matches"
msgstr "Sakrij rezultate pretrage"
-#: sphinx/themes/basic/static/searchtools.js:285
-msgid "Searching"
-msgstr "Tražim"
-
-#: sphinx/themes/basic/static/searchtools.js:290
-msgid "Preparing search..."
-msgstr "Pripremam pretraživanje..."
-
-#: sphinx/themes/basic/static/searchtools.js:364
-msgid ", in "
-msgstr ", u "
-
-#: sphinx/themes/basic/static/searchtools.js:491
-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 ""
-"Za vašu pretragu nema rezultata. Molimo pregledajte da li so sve riječi "
-"ispravno napisane i da li ste izbrali dovoljno kategorija."
-
-#: sphinx/themes/basic/static/searchtools.js:493
-#, python-format
-msgid "Search finished, found %s page(s) matching the search query."
-msgstr ""
-"Pretraživanje je zaključeno, pronađeno %s stranica, koje odgovaraju "
-"traženom nizu."
-
-#: sphinx/themes/default/static/sidebar.js:66
+#: sphinx/themes/default/static/sidebar.js:69
msgid "Expand sidebar"
msgstr ""
-#: sphinx/themes/default/static/sidebar.js:79
-#: sphinx/themes/default/static/sidebar.js:106
+#: sphinx/themes/default/static/sidebar.js:82
+#: sphinx/themes/default/static/sidebar.js:110
msgid "Collapse sidebar"
msgstr ""
@@ -761,35 +751,24 @@ msgstr ""
msgid "Contents"
msgstr ""
-#: sphinx/writers/latex.py:171
+#: sphinx/writers/latex.py:177
msgid "Release"
msgstr "Distribucija"
-#: sphinx/writers/latex.py:572 sphinx/writers/manpage.py:178
+#: sphinx/writers/latex.py:594 sphinx/writers/manpage.py:182
+#: sphinx/writers/texinfo.py:589
msgid "Footnotes"
msgstr ""
-#: sphinx/writers/latex.py:641
+#: sphinx/writers/latex.py:676
msgid "continued from previous page"
msgstr "nastavak sa prethodne stranice"
-#: sphinx/writers/latex.py:646
+#: sphinx/writers/latex.py:681
msgid "Continued on next page"
msgstr "nastavak na slijedećoj stranici"
-#: sphinx/writers/text.py:422
+#: sphinx/writers/text.py:437
msgid "[image]"
msgstr "[slika]"
-#~ msgid "Parameter"
-#~ msgstr "Parametar"
-
-#~ msgid "here"
-#~ msgstr "ovdje"
-
-#~ msgid "module, in "
-#~ msgstr "modul, u "
-
-#~ msgid "Platform: %s"
-#~ msgstr "Platforma: %s"
-
diff --git a/sphinx/locale/it/LC_MESSAGES/sphinx.js b/sphinx/locale/it/LC_MESSAGES/sphinx.js
index f9b193fe..590de16e 100644
--- a/sphinx/locale/it/LC_MESSAGES/sphinx.js
+++ b/sphinx/locale/it/LC_MESSAGES/sphinx.js
@@ -1 +1 @@
-Documentation.addTranslations({"locale": "it", "plural_expr": "(n != 1)", "messages": {"Search Results": "Risultati della ricerca", "Preparing search...": "Preparazione della ricerca", "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "La tua ricerca non ha trovato alcun risultato. Controlla la correttezza dei termini di ricerca e di avere selezionato un numero sufficiente di categorie", "Search finished, found %s page(s) matching the search query.": "Ricerca terminata, trovate %s pagine corrispondenti alla ricerca.", ", in ": ", in ", "Expand sidebar": "", "Permalink to this headline": "link permanente per questa intestazione", "Searching": "Ricerca in corso", "Collapse sidebar": "", "Permalink to this definition": "link permanente per questa definizione", "Hide Search Matches": "Nascondi i risultati della ricerca"}}); \ No newline at end of file
+Documentation.addTranslations({"locale": "it", "plural_expr": "(n != 1)", "messages": {"Hide Search Matches": "Nascondi i risultati della ricerca", "Permalink to this definition": "link permanente per questa definizione", "Expand sidebar": "", "Permalink to this headline": "link permanente per questa intestazione", "Collapse sidebar": ""}}); \ No newline at end of file
diff --git a/sphinx/locale/it/LC_MESSAGES/sphinx.mo b/sphinx/locale/it/LC_MESSAGES/sphinx.mo
index 10ca29a5..a4213c8e 100644
--- a/sphinx/locale/it/LC_MESSAGES/sphinx.mo
+++ b/sphinx/locale/it/LC_MESSAGES/sphinx.mo
Binary files differ
diff --git a/sphinx/locale/it/LC_MESSAGES/sphinx.po b/sphinx/locale/it/LC_MESSAGES/sphinx.po
index 40a2ca2a..ccfab24e 100644
--- a/sphinx/locale/it/LC_MESSAGES/sphinx.po
+++ b/sphinx/locale/it/LC_MESSAGES/sphinx.po
@@ -6,387 +6,406 @@ msgid ""
msgstr ""
"Project-Id-Version: Sphinx 0.5\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2008-11-27 18:39+0100\n"
-"PO-Revision-Date: 2010-05-24 23:54+0200\n"
+"POT-Creation-Date: 2011-09-21 10:06+0200\n"
+"PO-Revision-Date: 2011-01-22 14:41+0100\n"
"Last-Translator: Sandro Dentella <sandro@e-den.it>\n"
"Language-Team: <sphinx-dev@googlegroups.com>\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"
+"Generated-By: Babel 0.9.6\n"
-#: sphinx/environment.py:106 sphinx/writers/latex.py:184
-#: sphinx/writers/manpage.py:67
+#: sphinx/config.py:81
+#, fuzzy, python-format
+msgid "%s %s documentation"
+msgstr "%s %s documentazione"
+
+#: sphinx/environment.py:119 sphinx/writers/latex.py:190
+#: sphinx/writers/manpage.py:67 sphinx/writers/texinfo.py:203
#, python-format
msgid "%B %d, %Y"
msgstr "%d %B %Y"
-#: sphinx/roles.py:174
+#: sphinx/environment.py:1625
+#, python-format
+msgid "see %s"
+msgstr "vedi %s"
+
+#: sphinx/environment.py:1628
#, python-format
-msgid "Python Enhancement Proposals!PEP %s"
-msgstr "Python Enhancement Proposals!PEP %s"
+msgid "see also %s"
+msgstr "vedi anche %s"
-#: sphinx/builders/changes.py:72
+#: sphinx/roles.py:175
+#, python-format
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr "Python Enhancement Proposals; PEP %s"
+
+#: sphinx/builders/changes.py:73
msgid "Builtins"
msgstr "Builtin"
-#: sphinx/builders/changes.py:74
+#: sphinx/builders/changes.py:75
msgid "Module level"
msgstr "Modulo"
-#: sphinx/builders/html.py:266
+#: sphinx/builders/html.py:274
#, python-format
msgid "%b %d, %Y"
msgstr "%d/%b/%Y"
-#: sphinx/builders/html.py:285 sphinx/themes/basic/defindex.html:30
+#: sphinx/builders/html.py:293 sphinx/themes/basic/defindex.html:30
msgid "General Index"
msgstr "Indice generale"
-#: sphinx/builders/html.py:285
+#: sphinx/builders/html.py:293
msgid "index"
msgstr "indice"
-#: sphinx/builders/html.py:345
+#: sphinx/builders/html.py:353
msgid "next"
msgstr "successivo"
-#: sphinx/builders/html.py:354
+#: sphinx/builders/html.py:362
msgid "previous"
msgstr "precedente"
-#: sphinx/builders/latex.py:151
+#: sphinx/builders/latex.py:141 sphinx/builders/texinfo.py:196
msgid " (in "
msgstr " (in "
-#: sphinx/directives/other.py:127
+#: sphinx/directives/other.py:136
msgid "Section author: "
msgstr "Autore della sezione: "
-#: sphinx/directives/other.py:129
+#: sphinx/directives/other.py:138
msgid "Module author: "
msgstr "Autore del modulo: "
-#: sphinx/directives/other.py:131
+#: sphinx/directives/other.py:140
#, fuzzy
msgid "Code author: "
msgstr "Autore del modulo: "
-#: sphinx/directives/other.py:133
+#: sphinx/directives/other.py:142
msgid "Author: "
msgstr "Autore: "
-#: sphinx/directives/other.py:238
+#: sphinx/directives/other.py:215
msgid "See also"
msgstr "Vedi anche"
-#: sphinx/domains/__init__.py:253
+#: sphinx/domains/__init__.py:244
#, python-format
msgid "%s %s"
msgstr ""
-#: sphinx/domains/c.py:51 sphinx/domains/python.py:49
+#: sphinx/domains/c.py:51 sphinx/domains/python.py:95
msgid "Parameters"
msgstr "Parametri"
-#: sphinx/domains/c.py:54 sphinx/domains/javascript.py:137
-#: sphinx/domains/python.py:59
+#: sphinx/domains/c.py:54 sphinx/domains/javascript.py:128
+#: sphinx/domains/python.py:107
msgid "Returns"
msgstr "Ritorna"
-#: sphinx/domains/c.py:56 sphinx/domains/python.py:61
+#: sphinx/domains/c.py:56 sphinx/domains/python.py:109
msgid "Return type"
msgstr "Tipo di ritorno"
-#: sphinx/domains/c.py:133
+#: sphinx/domains/c.py:141
#, python-format
msgid "%s (C function)"
msgstr "%s (funzione C)"
-#: sphinx/domains/c.py:135
+#: sphinx/domains/c.py:143
#, python-format
msgid "%s (C member)"
msgstr "%s (membro C )"
-#: sphinx/domains/c.py:137
+#: sphinx/domains/c.py:145
#, python-format
msgid "%s (C macro)"
msgstr "%s (macro C)"
-#: sphinx/domains/c.py:139
+#: sphinx/domains/c.py:147
#, python-format
msgid "%s (C type)"
msgstr "%s (tipo C)"
-#: sphinx/domains/c.py:141
+#: sphinx/domains/c.py:149
#, python-format
msgid "%s (C variable)"
msgstr "%s (variabile C)"
-#: sphinx/domains/c.py:171 sphinx/domains/cpp.py:1031
-#: sphinx/domains/javascript.py:166 sphinx/domains/python.py:497
+#: sphinx/domains/c.py:204 sphinx/domains/cpp.py:1060
+#: sphinx/domains/javascript.py:162 sphinx/domains/python.py:559
msgid "function"
msgstr "funzione"
-#: sphinx/domains/c.py:172 sphinx/domains/cpp.py:1032
+#: sphinx/domains/c.py:205 sphinx/domains/cpp.py:1061
msgid "member"
msgstr "membro"
-#: sphinx/domains/c.py:173
+#: sphinx/domains/c.py:206
msgid "macro"
msgstr ""
-#: sphinx/domains/c.py:174 sphinx/domains/cpp.py:1033
+#: sphinx/domains/c.py:207 sphinx/domains/cpp.py:1062
msgid "type"
msgstr "tipo"
-#: sphinx/domains/c.py:175
+#: sphinx/domains/c.py:208
#, fuzzy
msgid "variable"
msgstr "Variabile"
-#: sphinx/domains/cpp.py:876
+#: sphinx/domains/cpp.py:904
#, python-format
msgid "%s (C++ class)"
msgstr "%s (classe C++)"
-#: sphinx/domains/cpp.py:891
+#: sphinx/domains/cpp.py:919
#, python-format
msgid "%s (C++ type)"
msgstr "%s (tipo C++)"
-#: sphinx/domains/cpp.py:910
+#: sphinx/domains/cpp.py:938
#, python-format
msgid "%s (C++ member)"
msgstr "%s (membro C++)"
-#: sphinx/domains/cpp.py:962
+#: sphinx/domains/cpp.py:990
#, python-format
msgid "%s (C++ function)"
msgstr "%s (funzione C++)"
-#: sphinx/domains/cpp.py:1030 sphinx/domains/python.py:499
+#: sphinx/domains/cpp.py:1059 sphinx/domains/javascript.py:163
+#: sphinx/domains/python.py:561
msgid "class"
msgstr ""
-#: sphinx/domains/javascript.py:117 sphinx/domains/python.py:221
+#: sphinx/domains/javascript.py:106 sphinx/domains/python.py:254
#, python-format
msgid "%s() (built-in function)"
msgstr "%s() (funzione built-in)"
-#: sphinx/domains/javascript.py:118 sphinx/domains/python.py:285
+#: sphinx/domains/javascript.py:107 sphinx/domains/python.py:318
#, python-format
msgid "%s() (%s method)"
msgstr "%s() (%s metodo)"
-#: sphinx/domains/javascript.py:120
+#: sphinx/domains/javascript.py:109
+#, python-format
+msgid "%s() (class)"
+msgstr "%s() (classe)"
+
+#: sphinx/domains/javascript.py:111
#, python-format
msgid "%s (global variable or constant)"
msgstr ""
-#: sphinx/domains/javascript.py:122 sphinx/domains/python.py:323
+#: sphinx/domains/javascript.py:113 sphinx/domains/python.py:356
#, python-format
msgid "%s (%s attribute)"
msgstr "%s (%s attributo)"
-#: sphinx/domains/javascript.py:131
+#: sphinx/domains/javascript.py:122
#, fuzzy
msgid "Arguments"
msgstr "Parametri"
-#: sphinx/domains/javascript.py:134
+#: sphinx/domains/javascript.py:125
msgid "Throws"
msgstr ""
-#: sphinx/domains/javascript.py:167 sphinx/domains/python.py:498
+#: sphinx/domains/javascript.py:164 sphinx/domains/python.py:560
msgid "data"
msgstr ""
-#: sphinx/domains/javascript.py:168 sphinx/domains/python.py:504
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:566
msgid "attribute"
msgstr "attributo"
-#: sphinx/domains/python.py:53
+#: sphinx/domains/python.py:100
#, fuzzy
msgid "Variables"
msgstr "Variabile"
-#: sphinx/domains/python.py:56
+#: sphinx/domains/python.py:104
msgid "Raises"
msgstr "Solleva"
-#: sphinx/domains/python.py:222 sphinx/domains/python.py:279
-#: sphinx/domains/python.py:291 sphinx/domains/python.py:304
+#: sphinx/domains/python.py:255 sphinx/domains/python.py:312
+#: sphinx/domains/python.py:324 sphinx/domains/python.py:337
#, python-format
msgid "%s() (in module %s)"
msgstr "%s() (nel modulo %s)"
-#: sphinx/domains/python.py:225
+#: sphinx/domains/python.py:258
#, python-format
msgid "%s (built-in variable)"
msgstr "%s (variabile built-in)"
-#: sphinx/domains/python.py:226 sphinx/domains/python.py:317
+#: sphinx/domains/python.py:259 sphinx/domains/python.py:350
#, python-format
msgid "%s (in module %s)"
msgstr "%s (nel modulo %s)"
-#: sphinx/domains/python.py:242
+#: sphinx/domains/python.py:275
#, python-format
msgid "%s (built-in class)"
msgstr "%s (classe built-in)"
-#: sphinx/domains/python.py:243
+#: sphinx/domains/python.py:276
#, python-format
msgid "%s (class in %s)"
msgstr "%s (classe in %s)"
-#: sphinx/domains/python.py:283
+#: sphinx/domains/python.py:316
#, python-format
msgid "%s() (%s.%s method)"
msgstr "%s() (%s.%s metodo)"
-#: sphinx/domains/python.py:295
+#: sphinx/domains/python.py:328
#, python-format
msgid "%s() (%s.%s static method)"
msgstr "%s() (%s.%s metodo statico)"
-#: sphinx/domains/python.py:298
+#: sphinx/domains/python.py:331
#, python-format
msgid "%s() (%s static method)"
msgstr "%s() (%s metodo statico)"
-#: sphinx/domains/python.py:308
+#: sphinx/domains/python.py:341
#, fuzzy, python-format
msgid "%s() (%s.%s class method)"
msgstr "%s() (%s.%s metodo)"
-#: sphinx/domains/python.py:311
+#: sphinx/domains/python.py:344
#, fuzzy, python-format
msgid "%s() (%s class method)"
msgstr "%s() (%s metodo)"
-#: sphinx/domains/python.py:321
+#: sphinx/domains/python.py:354
#, python-format
msgid "%s (%s.%s attribute)"
msgstr "%s (%s.%s attributo)"
-#: sphinx/domains/python.py:366
-msgid "Platforms: "
-msgstr "Piattaforme:"
-
-#: sphinx/domains/python.py:372
+#: sphinx/domains/python.py:434
#, python-format
msgid "%s (module)"
msgstr "%s (modulo)"
-#: sphinx/domains/python.py:429
+#: sphinx/domains/python.py:491
#, fuzzy
msgid "Python Module Index"
msgstr "Indice dei Moduli"
-#: sphinx/domains/python.py:430
+#: sphinx/domains/python.py:492
msgid "modules"
msgstr "moduli"
-#: sphinx/domains/python.py:475
+#: sphinx/domains/python.py:537
msgid "Deprecated"
msgstr "Deprecato"
-#: sphinx/domains/python.py:500 sphinx/locale/__init__.py:162
+#: sphinx/domains/python.py:562 sphinx/locale/__init__.py:179
msgid "exception"
msgstr "eccezione"
-#: sphinx/domains/python.py:501
+#: sphinx/domains/python.py:563
msgid "method"
msgstr ""
-#: sphinx/domains/python.py:502
-#, fuzzy, python-format
+#: sphinx/domains/python.py:564
msgid "class method"
-msgstr "%s() (%s metodo)"
+msgstr ""
-#: sphinx/domains/python.py:503
+#: sphinx/domains/python.py:565
msgid "static method"
msgstr "metodo statico"
-#: sphinx/domains/python.py:505 sphinx/locale/__init__.py:158
+#: sphinx/domains/python.py:567 sphinx/locale/__init__.py:175
msgid "module"
msgstr "modulo"
-#: sphinx/domains/rst.py:53
+#: sphinx/domains/python.py:695
+msgid " (deprecated)"
+msgstr " (deprecato)"
+
+#: sphinx/domains/rst.py:55
#, python-format
msgid "%s (directive)"
msgstr ""
-#: sphinx/domains/rst.py:55
-#, fuzzy, python-format
+#: sphinx/domains/rst.py:57
+#, python-format
msgid "%s (role)"
-msgstr "%s (modulo)"
+msgstr ""
-#: sphinx/domains/rst.py:103
+#: sphinx/domains/rst.py:106
msgid "directive"
msgstr ""
-#: sphinx/domains/rst.py:104
-#, fuzzy
+#: sphinx/domains/rst.py:107
msgid "role"
-msgstr "modulo"
+msgstr ""
-#: sphinx/domains/std.py:68 sphinx/domains/std.py:84
+#: sphinx/domains/std.py:70 sphinx/domains/std.py:86
#, python-format
msgid "environment variable; %s"
msgstr "variabile d'ambiente, %s"
-#: sphinx/domains/std.py:160
+#: sphinx/domains/std.py:162
#, python-format
msgid "%scommand line option; %s"
msgstr "%sopzione di linea di comando; %s"
-#: sphinx/domains/std.py:328
+#: sphinx/domains/std.py:393
msgid "glossary term"
msgstr ""
-#: sphinx/domains/std.py:329
+#: sphinx/domains/std.py:394
msgid "grammar token"
msgstr ""
-#: sphinx/domains/std.py:330
+#: sphinx/domains/std.py:395
msgid "reference label"
msgstr ""
-#: sphinx/domains/std.py:331
+#: sphinx/domains/std.py:396
msgid "environment variable"
msgstr "variabile d'ambiente"
-#: sphinx/domains/std.py:332
+#: sphinx/domains/std.py:397
msgid "program option"
msgstr ""
-#: sphinx/domains/std.py:360 sphinx/themes/basic/genindex-single.html:11
+#: sphinx/domains/std.py:427 sphinx/themes/basic/genindex-single.html:32
#: sphinx/themes/basic/genindex-split.html:11
#: sphinx/themes/basic/genindex-split.html:14
-#: sphinx/themes/basic/genindex.html:11 sphinx/themes/basic/genindex.html:14
-#: sphinx/themes/basic/genindex.html:50 sphinx/themes/basic/layout.html:125
-#: sphinx/writers/latex.py:173
+#: sphinx/themes/basic/genindex.html:32 sphinx/themes/basic/genindex.html:35
+#: sphinx/themes/basic/genindex.html:68 sphinx/themes/basic/layout.html:134
+#: sphinx/writers/latex.py:179 sphinx/writers/texinfo.py:456
msgid "Index"
msgstr "Indice"
-#: sphinx/domains/std.py:361
+#: sphinx/domains/std.py:428
msgid "Module Index"
msgstr "Indice dei Moduli"
-#: sphinx/domains/std.py:362 sphinx/themes/basic/defindex.html:25
+#: sphinx/domains/std.py:429 sphinx/themes/basic/defindex.html:25
msgid "Search Page"
msgstr "Cerca"
-#: sphinx/ext/autodoc.py:917
+#: sphinx/ext/autodoc.py:1002
#, python-format
msgid " Bases: %s"
msgstr ""
-#: sphinx/ext/autodoc.py:950
+#: sphinx/ext/autodoc.py:1038
#, python-format
msgid "alias of :class:`%s`"
msgstr "alias per :class:`%s`"
@@ -404,104 +423,104 @@ msgstr "(La <<riga originale>> si trova in %s, linea %d.)"
msgid "original entry"
msgstr "riga originale"
-#: sphinx/ext/viewcode.py:66
+#: sphinx/ext/viewcode.py:70
msgid "[source]"
msgstr ""
-#: sphinx/ext/viewcode.py:109
+#: sphinx/ext/viewcode.py:117
msgid "[docs]"
msgstr ""
-#: sphinx/ext/viewcode.py:123
+#: sphinx/ext/viewcode.py:131
#, fuzzy
msgid "Module code"
msgstr "modulo"
-#: sphinx/ext/viewcode.py:129
+#: sphinx/ext/viewcode.py:137
#, python-format
msgid "<h1>Source code for %s</h1>"
msgstr ""
-#: sphinx/ext/viewcode.py:156
+#: sphinx/ext/viewcode.py:164
msgid "Overview: module code"
msgstr ""
-#: sphinx/ext/viewcode.py:157
+#: sphinx/ext/viewcode.py:165
msgid "<h1>All modules for which code is available</h1>"
msgstr ""
-#: sphinx/locale/__init__.py:139
+#: sphinx/locale/__init__.py:155
msgid "Attention"
msgstr "Attenzione"
-#: sphinx/locale/__init__.py:140
+#: sphinx/locale/__init__.py:156
msgid "Caution"
msgstr "Attenzione"
-#: sphinx/locale/__init__.py:141
+#: sphinx/locale/__init__.py:157
msgid "Danger"
msgstr "Pericolo"
-#: sphinx/locale/__init__.py:142
+#: sphinx/locale/__init__.py:158
msgid "Error"
msgstr "Errore"
-#: sphinx/locale/__init__.py:143
+#: sphinx/locale/__init__.py:159
msgid "Hint"
msgstr "Consiglio"
-#: sphinx/locale/__init__.py:144
+#: sphinx/locale/__init__.py:160
msgid "Important"
msgstr "Importante"
-#: sphinx/locale/__init__.py:145
+#: sphinx/locale/__init__.py:161
msgid "Note"
msgstr "Nota"
-#: sphinx/locale/__init__.py:146
+#: sphinx/locale/__init__.py:162
msgid "See Also"
msgstr "Vedi anche"
-#: sphinx/locale/__init__.py:147
+#: sphinx/locale/__init__.py:163
msgid "Tip"
msgstr "Suggerimento"
-#: sphinx/locale/__init__.py:148
+#: sphinx/locale/__init__.py:164
msgid "Warning"
msgstr "Avvertimento"
-#: sphinx/locale/__init__.py:152
+#: sphinx/locale/__init__.py:168
#, python-format
msgid "New in version %s"
msgstr "Nuovo nella versione %s"
-#: sphinx/locale/__init__.py:153
+#: sphinx/locale/__init__.py:169
#, python-format
msgid "Changed in version %s"
msgstr "Cambiato nella versione %s"
-#: sphinx/locale/__init__.py:154
+#: sphinx/locale/__init__.py:170
#, python-format
msgid "Deprecated since version %s"
msgstr "Deprecato dalla versione %s"
-#: sphinx/locale/__init__.py:159
+#: sphinx/locale/__init__.py:176
msgid "keyword"
msgstr "keyword"
-#: sphinx/locale/__init__.py:160
+#: sphinx/locale/__init__.py:177
msgid "operator"
msgstr "operatore"
-#: sphinx/locale/__init__.py:161
+#: sphinx/locale/__init__.py:178
msgid "object"
msgstr "oggetto"
-#: sphinx/locale/__init__.py:163
+#: sphinx/locale/__init__.py:180
msgid "statement"
msgstr "statement"
-#: sphinx/locale/__init__.py:164
+#: sphinx/locale/__init__.py:181
msgid "built-in function"
msgstr "funzione built-in"
@@ -510,8 +529,8 @@ msgstr "funzione built-in"
msgid "Table Of Contents"
msgstr "Tabella dei contenuti"
-#: sphinx/themes/agogo/layout.html:49 sphinx/themes/basic/layout.html:128
-#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:14
+#: sphinx/themes/agogo/layout.html:49 sphinx/themes/basic/layout.html:137
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:20
msgid "Search"
msgstr "Cerca"
@@ -559,15 +578,15 @@ msgstr "accesso veloce ai moduli"
msgid "all functions, classes, terms"
msgstr "tutte le funzioni, classi e moduli"
-#: sphinx/themes/basic/genindex-single.html:14
+#: sphinx/themes/basic/genindex-single.html:35
#, python-format
msgid "Index &ndash; %(key)s"
msgstr "Indice &ndash; %(key)s"
-#: sphinx/themes/basic/genindex-single.html:46
+#: sphinx/themes/basic/genindex-single.html:63
#: sphinx/themes/basic/genindex-split.html:24
#: sphinx/themes/basic/genindex-split.html:38
-#: sphinx/themes/basic/genindex.html:56
+#: sphinx/themes/basic/genindex.html:74
msgid "Full index on one page"
msgstr "Indice completo in una pagina"
@@ -579,39 +598,39 @@ msgstr "Indice delle pagine per lettera"
msgid "can be huge"
msgstr "può essere enorme"
-#: sphinx/themes/basic/layout.html:23
+#: sphinx/themes/basic/layout.html:29
msgid "Navigation"
msgstr "Navigazione"
-#: sphinx/themes/basic/layout.html:113
+#: sphinx/themes/basic/layout.html:122
#, python-format
msgid "Search within %(docstitle)s"
msgstr "Cerca in %(docstitle)s"
-#: sphinx/themes/basic/layout.html:122
+#: sphinx/themes/basic/layout.html:131
msgid "About these documents"
msgstr "A proposito di questi documenti"
-#: sphinx/themes/basic/layout.html:131
+#: sphinx/themes/basic/layout.html:140
msgid "Copyright"
msgstr "Copyright"
-#: sphinx/themes/basic/layout.html:180
+#: sphinx/themes/basic/layout.html:189
#, python-format
msgid "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
msgstr "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
-#: sphinx/themes/basic/layout.html:182
+#: sphinx/themes/basic/layout.html:191
#, python-format
msgid "&copy; Copyright %(copyright)s."
msgstr "&copy; Copyright %(copyright)s."
-#: sphinx/themes/basic/layout.html:186
+#: sphinx/themes/basic/layout.html:195
#, python-format
msgid "Last updated on %(last_updated)s."
msgstr "Ultimo aggiornamento %(last_updated)s."
-#: sphinx/themes/basic/layout.html:189
+#: sphinx/themes/basic/layout.html:198
#, python-format
msgid ""
"Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
@@ -641,13 +660,13 @@ msgstr "Argomento successivo"
msgid "next chapter"
msgstr "capitolo successivo"
-#: sphinx/themes/basic/search.html:18
+#: sphinx/themes/basic/search.html:24
msgid ""
"Please activate JavaScript to enable the search\n"
" functionality."
msgstr ""
-#: sphinx/themes/basic/search.html:23
+#: sphinx/themes/basic/search.html:29
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"
@@ -661,16 +680,15 @@ msgstr ""
" di ricerca cerca automaticamente per tutte le parole. Le pagine\n"
" che contendono meno parole non compariranno nei risultati di ricerca."
-#: sphinx/themes/basic/search.html:30
+#: sphinx/themes/basic/search.html:36
msgid "search"
msgstr "cerca"
-#: sphinx/themes/basic/search.html:34
-#: sphinx/themes/basic/static/searchtools.js:489
+#: sphinx/themes/basic/search.html:40
msgid "Search Results"
msgstr "Risultati della ricerca"
-#: sphinx/themes/basic/search.html:36
+#: sphinx/themes/basic/search.html:42
msgid "Your search did not match any results."
msgstr "La tua ricerca non ha ottenuto risultati"
@@ -710,12 +728,12 @@ msgstr "Modifiche nelle API C"
msgid "Other changes"
msgstr "Altre modifiche"
-#: sphinx/themes/basic/static/doctools.js:154 sphinx/writers/html.py:482
-#: sphinx/writers/html.py:487
+#: sphinx/themes/basic/static/doctools.js:154 sphinx/writers/html.py:504
+#: sphinx/writers/html.py:510
msgid "Permalink to this headline"
msgstr "link permanente per questa intestazione"
-#: sphinx/themes/basic/static/doctools.js:160 sphinx/writers/html.py:87
+#: sphinx/themes/basic/static/doctools.js:160 sphinx/writers/html.py:92
msgid "Permalink to this definition"
msgstr "link permanente per questa definizione"
@@ -723,38 +741,12 @@ msgstr "link permanente per questa definizione"
msgid "Hide Search Matches"
msgstr "Nascondi i risultati della ricerca"
-#: sphinx/themes/basic/static/searchtools.js:285
-msgid "Searching"
-msgstr "Ricerca in corso"
-
-#: sphinx/themes/basic/static/searchtools.js:290
-msgid "Preparing search..."
-msgstr "Preparazione della ricerca"
-
-#: sphinx/themes/basic/static/searchtools.js:364
-msgid ", in "
-msgstr ", in "
-
-#: sphinx/themes/basic/static/searchtools.js:491
-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 ""
-"La tua ricerca non ha trovato alcun risultato. Controlla la correttezza "
-"dei termini di ricerca e di avere selezionato un numero sufficiente di "
-"categorie"
-
-#: sphinx/themes/basic/static/searchtools.js:493
-#, python-format
-msgid "Search finished, found %s page(s) matching the search query."
-msgstr "Ricerca terminata, trovate %s pagine corrispondenti alla ricerca."
-
-#: sphinx/themes/default/static/sidebar.js:66
+#: sphinx/themes/default/static/sidebar.js:69
msgid "Expand sidebar"
msgstr ""
-#: sphinx/themes/default/static/sidebar.js:79
-#: sphinx/themes/default/static/sidebar.js:106
+#: sphinx/themes/default/static/sidebar.js:82
+#: sphinx/themes/default/static/sidebar.js:110
msgid "Collapse sidebar"
msgstr ""
@@ -762,23 +754,25 @@ msgstr ""
msgid "Contents"
msgstr ""
-#: sphinx/writers/latex.py:171
+#: sphinx/writers/latex.py:177
msgid "Release"
msgstr "Release"
-#: sphinx/writers/latex.py:572 sphinx/writers/manpage.py:178
+#: sphinx/writers/latex.py:594 sphinx/writers/manpage.py:182
+#: sphinx/writers/texinfo.py:589
msgid "Footnotes"
msgstr ""
-#: sphinx/writers/latex.py:641
+#: sphinx/writers/latex.py:676
msgid "continued from previous page"
msgstr ""
-#: sphinx/writers/latex.py:646
+#: sphinx/writers/latex.py:681
#, fuzzy
msgid "Continued on next page"
msgstr "Indice completo in una pagina"
-#: sphinx/writers/text.py:422
+#: sphinx/writers/text.py:437
msgid "[image]"
msgstr "[immagine]"
+
diff --git a/sphinx/locale/ja/LC_MESSAGES/sphinx.js b/sphinx/locale/ja/LC_MESSAGES/sphinx.js
index 6b63245e..feb32159 100644
--- a/sphinx/locale/ja/LC_MESSAGES/sphinx.js
+++ b/sphinx/locale/ja/LC_MESSAGES/sphinx.js
@@ -1 +1 @@
-Documentation.addTranslations({"locale": "ja", "plural_expr": "0", "messages": {"Search Results": "\u691c\u7d22\u7d50\u679c", "Preparing search...": "\u691c\u7d22\u306e\u6e96\u5099\u4e2d...", "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "\u691c\u7d22\u6761\u4ef6\u306b\u4e00\u81f4\u3059\u308b\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u306f\u3042\u308a\u307e\u305b\u3093\u3067\u3057\u305f\u3002\u691c\u7d22\u3057\u305f\u3044\u8a00\u8449\u3092\u6b63\u3057\u3044\u3064\u3065\u308a\u3067\u5165\u529b\u3057\u3066\u3044\u308b\u304b\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u307e\u305f\u3001\u6b63\u3057\u3044\u30ab\u30c6\u30b4\u30ea\u306e\u691c\u7d22\u3092\u884c\u3063\u3066\u3044\u308b\u304b\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002", "Search finished, found %s page(s) matching the search query.": "\u691c\u7d22\u304c\u7d42\u4e86\u3057\u3001\u6761\u4ef6\u306b\u4e00\u81f4\u3059\u308b\u30da\u30fc\u30b8\u304c %s \u500b\u307f\u3064\u304b\u308a\u307e\u3057\u305f\u3002", ", in ": "", "Expand sidebar": "", "Permalink to this headline": "\u3053\u306e\u30d8\u30c3\u30c9\u30e9\u30a4\u30f3\u3078\u306e\u30d1\u30fc\u30de\u30ea\u30f3\u30af", "Searching": "\u691c\u7d22\u4e2d", "Collapse sidebar": "", "Permalink to this definition": "\u3053\u306e\u5b9a\u7fa9\u3078\u306e\u30d1\u30fc\u30de\u30ea\u30f3\u30af", "Hide Search Matches": "\u691c\u7d22\u7d50\u679c\u3092\u96a0\u3059"}}); \ No newline at end of file
+Documentation.addTranslations({"locale": "ja", "plural_expr": "0", "messages": {"Hide Search Matches": "\u691c\u7d22\u7d50\u679c\u3092\u96a0\u3059", "Permalink to this definition": "\u3053\u306e\u5b9a\u7fa9\u3078\u306e\u30d1\u30fc\u30de\u30ea\u30f3\u30af", "Expand sidebar": "\u30b5\u30a4\u30c9\u30d0\u30fc\u3092\u5c55\u958b", "Permalink to this headline": "\u3053\u306e\u30d8\u30c3\u30c9\u30e9\u30a4\u30f3\u3078\u306e\u30d1\u30fc\u30de\u30ea\u30f3\u30af", "Collapse sidebar": "\u30b5\u30a4\u30c9\u30d0\u30fc\u3092\u305f\u305f\u3080"}}); \ No newline at end of file
diff --git a/sphinx/locale/ja/LC_MESSAGES/sphinx.mo b/sphinx/locale/ja/LC_MESSAGES/sphinx.mo
index b0284f91..2bbd3b24 100644
--- a/sphinx/locale/ja/LC_MESSAGES/sphinx.mo
+++ b/sphinx/locale/ja/LC_MESSAGES/sphinx.mo
Binary files differ
diff --git a/sphinx/locale/ja/LC_MESSAGES/sphinx.po b/sphinx/locale/ja/LC_MESSAGES/sphinx.po
index 5f65a6c3..17d26d93 100644
--- a/sphinx/locale/ja/LC_MESSAGES/sphinx.po
+++ b/sphinx/locale/ja/LC_MESSAGES/sphinx.po
@@ -2,392 +2,408 @@
# Copyright (C) 2008 ORGANIZATION
# This file is distributed under the same license as the Sphinx project.
# Yasushi Masuda <whosaysni@gmail.com>, 2008.
+# Kouhei Sutou <kou@clear-code.com>, 2011.
+# Akitoshi Ohta <fire.kuma8@gmail.com>, 2011.
#
msgid ""
msgstr ""
-"Project-Id-Version: Sphinx 0.5\n"
+"Project-Id-Version: Sphinx 1.1pre\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2008-09-11 23:58+0200\n"
-"PO-Revision-Date: 2010-05-24 23:54+0200\n"
-"Last-Translator: Yasushi MASUDA <whosaysni@gmail.com>\n"
-"Language-Team: ja <LL@li.org>\n"
+"POT-Creation-Date: 2011-09-21 10:06+0200\n"
+"PO-Revision-Date: 2011-08-27 17:50+0900\n"
+"Last-Translator: Akitoshi Ohta <fire.kuma8@gmail.com>\n"
+"Language-Team: Japanese\n"
"Plural-Forms: nplurals=1; plural=0\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"
+"Generated-By: Babel 0.9.6\n"
-#: sphinx/environment.py:106 sphinx/writers/latex.py:184
-#: sphinx/writers/manpage.py:67
+#: sphinx/config.py:81
+#, python-format
+msgid "%s %s documentation"
+msgstr ""
+
+#: sphinx/environment.py:119 sphinx/writers/latex.py:190
+#: sphinx/writers/manpage.py:67 sphinx/writers/texinfo.py:203
#, python-format
msgid "%B %d, %Y"
msgstr "%Y 年 %m 月 %d 日"
-#: sphinx/roles.py:174
+#: sphinx/environment.py:1625
+#, python-format
+msgid "see %s"
+msgstr "%sを参照"
+
+#: sphinx/environment.py:1628
#, python-format
-msgid "Python Enhancement Proposals!PEP %s"
-msgstr "Python Enhancement Proposals!PEP %s"
+msgid "see also %s"
+msgstr "%sも参照"
-#: sphinx/builders/changes.py:72
+#: sphinx/roles.py:175
+#, python-format
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr "Python Enhancement Proposals; PEP %s"
+
+#: sphinx/builders/changes.py:73
msgid "Builtins"
msgstr "組み込み"
-#: sphinx/builders/changes.py:74
+#: sphinx/builders/changes.py:75
msgid "Module level"
msgstr "モジュールレベル"
-#: sphinx/builders/html.py:266
+#: sphinx/builders/html.py:274
#, python-format
msgid "%b %d, %Y"
msgstr "%Y 年 %m 月 %d 日"
-#: sphinx/builders/html.py:285 sphinx/themes/basic/defindex.html:30
+#: sphinx/builders/html.py:293 sphinx/themes/basic/defindex.html:30
msgid "General Index"
msgstr "総合索引"
-#: sphinx/builders/html.py:285
+#: sphinx/builders/html.py:293
msgid "index"
msgstr "索引"
-#: sphinx/builders/html.py:345
+#: sphinx/builders/html.py:353
msgid "next"
msgstr "次へ"
-#: sphinx/builders/html.py:354
+#: sphinx/builders/html.py:362
msgid "previous"
msgstr "前へ"
-#: sphinx/builders/latex.py:151
+#: sphinx/builders/latex.py:141 sphinx/builders/texinfo.py:196
msgid " (in "
msgstr ""
-#: sphinx/directives/other.py:127
+#: sphinx/directives/other.py:136
msgid "Section author: "
msgstr "この節の作者: "
-#: sphinx/directives/other.py:129
+#: sphinx/directives/other.py:138
msgid "Module author: "
msgstr "モジュールの作者: "
-#: sphinx/directives/other.py:131
-#, fuzzy
+#: sphinx/directives/other.py:140
msgid "Code author: "
-msgstr "モジュールの作者: "
+msgstr "コードの作者: "
-#: sphinx/directives/other.py:133
+#: sphinx/directives/other.py:142
msgid "Author: "
msgstr "作者: "
-#: sphinx/directives/other.py:238
+#: sphinx/directives/other.py:215
msgid "See also"
msgstr "参考"
-#: sphinx/domains/__init__.py:253
+#: sphinx/domains/__init__.py:244
#, python-format
msgid "%s %s"
msgstr ""
-#: sphinx/domains/c.py:51 sphinx/domains/python.py:49
+#: sphinx/domains/c.py:51 sphinx/domains/python.py:95
msgid "Parameters"
msgstr "パラメタ"
-#: sphinx/domains/c.py:54 sphinx/domains/javascript.py:137
-#: sphinx/domains/python.py:59
+#: sphinx/domains/c.py:54 sphinx/domains/javascript.py:128
+#: sphinx/domains/python.py:107
msgid "Returns"
msgstr "戻り値"
-#: sphinx/domains/c.py:56 sphinx/domains/python.py:61
+#: sphinx/domains/c.py:56 sphinx/domains/python.py:109
msgid "Return type"
msgstr "戻り値の型"
-#: sphinx/domains/c.py:133
+#: sphinx/domains/c.py:141
#, python-format
msgid "%s (C function)"
msgstr "%s (C の関数)"
-#: sphinx/domains/c.py:135
+#: sphinx/domains/c.py:143
#, python-format
msgid "%s (C member)"
msgstr "%s (C のメンバ変数)"
-#: sphinx/domains/c.py:137
+#: sphinx/domains/c.py:145
#, python-format
msgid "%s (C macro)"
msgstr "%s (C のマクロ)"
-#: sphinx/domains/c.py:139
+#: sphinx/domains/c.py:147
#, python-format
msgid "%s (C type)"
msgstr "%s (C のデータ型)"
-#: sphinx/domains/c.py:141
+#: sphinx/domains/c.py:149
#, python-format
msgid "%s (C variable)"
msgstr "%s (C の変数)"
-#: sphinx/domains/c.py:171 sphinx/domains/cpp.py:1031
-#: sphinx/domains/javascript.py:166 sphinx/domains/python.py:497
+#: sphinx/domains/c.py:204 sphinx/domains/cpp.py:1060
+#: sphinx/domains/javascript.py:162 sphinx/domains/python.py:559
msgid "function"
msgstr "の関数"
-#: sphinx/domains/c.py:172 sphinx/domains/cpp.py:1032
+#: sphinx/domains/c.py:205 sphinx/domains/cpp.py:1061
msgid "member"
msgstr "のメンバ変数"
-#: sphinx/domains/c.py:173
+#: sphinx/domains/c.py:206
msgid "macro"
msgstr "のマクロ"
-#: sphinx/domains/c.py:174 sphinx/domains/cpp.py:1033
+#: sphinx/domains/c.py:207 sphinx/domains/cpp.py:1062
msgid "type"
msgstr "のデータ型"
-#: sphinx/domains/c.py:175
-#, fuzzy
+#: sphinx/domains/c.py:208
msgid "variable"
msgstr "変数"
-#: sphinx/domains/cpp.py:876
-#, fuzzy, python-format
+#: sphinx/domains/cpp.py:904
+#, python-format
msgid "%s (C++ class)"
-msgstr "%s (のクラス)"
+msgstr "%s (C++ のクラス)"
-#: sphinx/domains/cpp.py:891
+#: sphinx/domains/cpp.py:919
#, python-format
msgid "%s (C++ type)"
msgstr "%s (C++ のデータ型)"
-#: sphinx/domains/cpp.py:910
+#: sphinx/domains/cpp.py:938
#, python-format
msgid "%s (C++ member)"
msgstr "%s (C++ のメンバ変数)"
-#: sphinx/domains/cpp.py:962
+#: sphinx/domains/cpp.py:990
#, python-format
msgid "%s (C++ function)"
msgstr "%s (C++ の関数)"
-#: sphinx/domains/cpp.py:1030 sphinx/domains/python.py:499
+#: sphinx/domains/cpp.py:1059 sphinx/domains/javascript.py:163
+#: sphinx/domains/python.py:561
msgid "class"
-msgstr ""
+msgstr "クラス"
-#: sphinx/domains/javascript.py:117 sphinx/domains/python.py:221
+#: sphinx/domains/javascript.py:106 sphinx/domains/python.py:254
#, python-format
msgid "%s() (built-in function)"
msgstr "%s() (組み込み関数)"
-#: sphinx/domains/javascript.py:118 sphinx/domains/python.py:285
+#: sphinx/domains/javascript.py:107 sphinx/domains/python.py:318
#, python-format
msgid "%s() (%s method)"
msgstr "%s() (%s のメソッド)"
-#: sphinx/domains/javascript.py:120
+#: sphinx/domains/javascript.py:109
+#, python-format
+msgid "%s() (class)"
+msgstr "%s() (クラス)"
+
+#: sphinx/domains/javascript.py:111
#, python-format
msgid "%s (global variable or constant)"
-msgstr ""
+msgstr "%s (グローバル変数または定数)"
-#: sphinx/domains/javascript.py:122 sphinx/domains/python.py:323
+#: sphinx/domains/javascript.py:113 sphinx/domains/python.py:356
#, python-format
msgid "%s (%s attribute)"
msgstr "%s (%s の属性)"
-#: sphinx/domains/javascript.py:131
-#, fuzzy
+#: sphinx/domains/javascript.py:122
msgid "Arguments"
-msgstr "パラメタ"
+msgstr "引数"
-#: sphinx/domains/javascript.py:134
+#: sphinx/domains/javascript.py:125
msgid "Throws"
-msgstr ""
+msgstr "例外"
-#: sphinx/domains/javascript.py:167 sphinx/domains/python.py:498
+#: sphinx/domains/javascript.py:164 sphinx/domains/python.py:560
msgid "data"
-msgstr ""
+msgstr "データ"
-#: sphinx/domains/javascript.py:168 sphinx/domains/python.py:504
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:566
msgid "attribute"
msgstr "の属性"
-#: sphinx/domains/python.py:53
-#, fuzzy
+#: sphinx/domains/python.py:100
msgid "Variables"
msgstr "変数"
-#: sphinx/domains/python.py:56
+#: sphinx/domains/python.py:104
msgid "Raises"
msgstr "例外"
-#: sphinx/domains/python.py:222 sphinx/domains/python.py:279
-#: sphinx/domains/python.py:291 sphinx/domains/python.py:304
+#: sphinx/domains/python.py:255 sphinx/domains/python.py:312
+#: sphinx/domains/python.py:324 sphinx/domains/python.py:337
#, python-format
msgid "%s() (in module %s)"
msgstr "%s() (%s モジュール)"
-#: sphinx/domains/python.py:225
+#: sphinx/domains/python.py:258
#, python-format
msgid "%s (built-in variable)"
msgstr "%s (組み込み変数)"
-#: sphinx/domains/python.py:226 sphinx/domains/python.py:317
+#: sphinx/domains/python.py:259 sphinx/domains/python.py:350
#, python-format
msgid "%s (in module %s)"
msgstr "%s (%s モジュール)"
-#: sphinx/domains/python.py:242
+#: sphinx/domains/python.py:275
#, python-format
msgid "%s (built-in class)"
msgstr "%s (組み込み変数)"
-#: sphinx/domains/python.py:243
+#: sphinx/domains/python.py:276
#, python-format
msgid "%s (class in %s)"
msgstr "%s (%s のクラス)"
-#: sphinx/domains/python.py:283
+#: sphinx/domains/python.py:316
#, python-format
msgid "%s() (%s.%s method)"
msgstr "%s() (%s.%s のメソッド)"
-#: sphinx/domains/python.py:295
+#: sphinx/domains/python.py:328
#, python-format
msgid "%s() (%s.%s static method)"
msgstr "%s() (%s.%s の静的メソッド)"
-#: sphinx/domains/python.py:298
+#: sphinx/domains/python.py:331
#, python-format
msgid "%s() (%s static method)"
msgstr "%s() (%s の静的メソッド)"
-#: sphinx/domains/python.py:308
-#, fuzzy, python-format
+#: sphinx/domains/python.py:341
+#, python-format
msgid "%s() (%s.%s class method)"
-msgstr "%s() (%s.%s のメソッド)"
+msgstr "%s() (%s.%s のクラスメソッド)"
-#: sphinx/domains/python.py:311
-#, fuzzy, python-format
+#: sphinx/domains/python.py:344
+#, python-format
msgid "%s() (%s class method)"
-msgstr "%s() (%s のメソッド)"
+msgstr "%s() (%s のクラスメソッド)"
-#: sphinx/domains/python.py:321
+#: sphinx/domains/python.py:354
#, python-format
msgid "%s (%s.%s attribute)"
msgstr "%s (%s.%s の属性)"
-#: sphinx/domains/python.py:366
-msgid "Platforms: "
-msgstr "プラットフォーム: "
-
-#: sphinx/domains/python.py:372
+#: sphinx/domains/python.py:434
#, python-format
msgid "%s (module)"
msgstr "%s (モジュール)"
-#: sphinx/domains/python.py:429
-#, fuzzy
+#: sphinx/domains/python.py:491
msgid "Python Module Index"
-msgstr "モジュール索引"
+msgstr "Pythonモジュール索引"
-#: sphinx/domains/python.py:430
+#: sphinx/domains/python.py:492
msgid "modules"
msgstr "モジュール"
-#: sphinx/domains/python.py:475
+#: sphinx/domains/python.py:537
msgid "Deprecated"
msgstr "撤廃"
-#: sphinx/domains/python.py:500 sphinx/locale/__init__.py:162
+#: sphinx/domains/python.py:562 sphinx/locale/__init__.py:179
msgid "exception"
msgstr "例外"
-#: sphinx/domains/python.py:501
+#: sphinx/domains/python.py:563
msgid "method"
-msgstr ""
+msgstr "メソッド"
-#: sphinx/domains/python.py:502
-#, fuzzy, python-format
+#: sphinx/domains/python.py:564
msgid "class method"
-msgstr "%s() (%s のメソッド)"
+msgstr "クラスメソッド"
-#: sphinx/domains/python.py:503
+#: sphinx/domains/python.py:565
msgid "static method"
msgstr "の静的メソッド"
-#: sphinx/domains/python.py:505 sphinx/locale/__init__.py:158
+#: sphinx/domains/python.py:567 sphinx/locale/__init__.py:175
msgid "module"
msgstr "モジュール"
-#: sphinx/domains/rst.py:53
+#: sphinx/domains/python.py:695
+msgid " (deprecated)"
+msgstr " (撤廃)"
+
+#: sphinx/domains/rst.py:55
#, python-format
msgid "%s (directive)"
-msgstr ""
+msgstr "%s (ディレクティブ)"
-#: sphinx/domains/rst.py:55
-#, fuzzy, python-format
+#: sphinx/domains/rst.py:57
+#, python-format
msgid "%s (role)"
-msgstr "%s (モジュール)"
+msgstr "%s (ロール)"
-#: sphinx/domains/rst.py:103
+#: sphinx/domains/rst.py:106
msgid "directive"
-msgstr ""
+msgstr "ディレクティブ"
-#: sphinx/domains/rst.py:104
-#, fuzzy
+#: sphinx/domains/rst.py:107
msgid "role"
-msgstr "モジュール"
+msgstr "ロール"
-#: sphinx/domains/std.py:68 sphinx/domains/std.py:84
+#: sphinx/domains/std.py:70 sphinx/domains/std.py:86
#, python-format
msgid "environment variable; %s"
msgstr "環境変数; %s"
-#: sphinx/domains/std.py:160
+#: sphinx/domains/std.py:162
#, python-format
msgid "%scommand line option; %s"
msgstr "%sコマンドラインオプション; %s"
-#: sphinx/domains/std.py:328
+#: sphinx/domains/std.py:393
msgid "glossary term"
-msgstr ""
+msgstr "用語集の項目"
-#: sphinx/domains/std.py:329
+#: sphinx/domains/std.py:394
msgid "grammar token"
-msgstr ""
+msgstr "文法トークン"
-#: sphinx/domains/std.py:330
+#: sphinx/domains/std.py:395
msgid "reference label"
-msgstr ""
+msgstr "参照ラベル"
-#: sphinx/domains/std.py:331
+#: sphinx/domains/std.py:396
msgid "environment variable"
msgstr "環境変数"
-#: sphinx/domains/std.py:332
+#: sphinx/domains/std.py:397
msgid "program option"
-msgstr ""
+msgstr "プログラムオプション"
-#: sphinx/domains/std.py:360 sphinx/themes/basic/genindex-single.html:11
+#: sphinx/domains/std.py:427 sphinx/themes/basic/genindex-single.html:32
#: sphinx/themes/basic/genindex-split.html:11
#: sphinx/themes/basic/genindex-split.html:14
-#: sphinx/themes/basic/genindex.html:11 sphinx/themes/basic/genindex.html:14
-#: sphinx/themes/basic/genindex.html:50 sphinx/themes/basic/layout.html:125
-#: sphinx/writers/latex.py:173
+#: sphinx/themes/basic/genindex.html:32 sphinx/themes/basic/genindex.html:35
+#: sphinx/themes/basic/genindex.html:68 sphinx/themes/basic/layout.html:134
+#: sphinx/writers/latex.py:179 sphinx/writers/texinfo.py:456
msgid "Index"
msgstr "索引"
-#: sphinx/domains/std.py:361
+#: sphinx/domains/std.py:428
msgid "Module Index"
msgstr "モジュール索引"
-#: sphinx/domains/std.py:362 sphinx/themes/basic/defindex.html:25
+#: sphinx/domains/std.py:429 sphinx/themes/basic/defindex.html:25
msgid "Search Page"
msgstr "検索ページ"
-#: sphinx/ext/autodoc.py:917
+#: sphinx/ext/autodoc.py:1002
#, python-format
msgid " Bases: %s"
msgstr " ベースクラス: %s"
-#: sphinx/ext/autodoc.py:950
+#: sphinx/ext/autodoc.py:1038
#, python-format
msgid "alias of :class:`%s`"
msgstr ":class:`%s` のエイリアス"
@@ -399,110 +415,109 @@ msgstr "課題"
#: sphinx/ext/todo.py:109
#, python-format
msgid "(The <<original entry>> is located in %s, line %d.)"
-msgstr ""
+msgstr "(<<元のエントリ>> は、 %s の %d 行目です)"
#: sphinx/ext/todo.py:117
msgid "original entry"
-msgstr ""
+msgstr "元のエントリ"
-#: sphinx/ext/viewcode.py:66
+#: sphinx/ext/viewcode.py:70
msgid "[source]"
-msgstr ""
+msgstr "[ソース]"
-#: sphinx/ext/viewcode.py:109
+#: sphinx/ext/viewcode.py:117
msgid "[docs]"
-msgstr ""
+msgstr "[ドキュメント]"
-#: sphinx/ext/viewcode.py:123
-#, fuzzy
+#: sphinx/ext/viewcode.py:131
msgid "Module code"
-msgstr "モジュール"
+msgstr "モジュールコード"
-#: sphinx/ext/viewcode.py:129
+#: sphinx/ext/viewcode.py:137
#, python-format
msgid "<h1>Source code for %s</h1>"
-msgstr ""
+msgstr "<h1>%s のソースコード</h1>"
-#: sphinx/ext/viewcode.py:156
+#: sphinx/ext/viewcode.py:164
msgid "Overview: module code"
-msgstr ""
+msgstr "概要: モジュールコード"
-#: sphinx/ext/viewcode.py:157
+#: sphinx/ext/viewcode.py:165
msgid "<h1>All modules for which code is available</h1>"
-msgstr ""
+msgstr "<h1>全モジュールのうち、コードを読めるもの</h1>"
-#: sphinx/locale/__init__.py:139
+#: sphinx/locale/__init__.py:155
msgid "Attention"
msgstr "注意"
-#: sphinx/locale/__init__.py:140
+#: sphinx/locale/__init__.py:156
msgid "Caution"
msgstr "ご用心"
-#: sphinx/locale/__init__.py:141
+#: sphinx/locale/__init__.py:157
msgid "Danger"
msgstr "危険"
-#: sphinx/locale/__init__.py:142
+#: sphinx/locale/__init__.py:158
msgid "Error"
msgstr "エラー"
-#: sphinx/locale/__init__.py:143
+#: sphinx/locale/__init__.py:159
msgid "Hint"
msgstr "ヒント"
-#: sphinx/locale/__init__.py:144
+#: sphinx/locale/__init__.py:160
msgid "Important"
msgstr "重要"
-#: sphinx/locale/__init__.py:145
+#: sphinx/locale/__init__.py:161
msgid "Note"
msgstr "ノート"
-#: sphinx/locale/__init__.py:146
+#: sphinx/locale/__init__.py:162
msgid "See Also"
msgstr "参考"
-#: sphinx/locale/__init__.py:147
+#: sphinx/locale/__init__.py:163
msgid "Tip"
msgstr "ちなみに"
-#: sphinx/locale/__init__.py:148
+#: sphinx/locale/__init__.py:164
msgid "Warning"
msgstr "警告"
-#: sphinx/locale/__init__.py:152
+#: sphinx/locale/__init__.py:168
#, python-format
msgid "New in version %s"
msgstr "バージョン %s で追加"
-#: sphinx/locale/__init__.py:153
+#: sphinx/locale/__init__.py:169
#, python-format
msgid "Changed in version %s"
msgstr "バージョン %s で変更"
-#: sphinx/locale/__init__.py:154
+#: sphinx/locale/__init__.py:170
#, python-format
msgid "Deprecated since version %s"
msgstr "バージョン %s で撤廃"
-#: sphinx/locale/__init__.py:159
+#: sphinx/locale/__init__.py:176
msgid "keyword"
msgstr "キーワード"
-#: sphinx/locale/__init__.py:160
+#: sphinx/locale/__init__.py:177
msgid "operator"
msgstr "演算子"
-#: sphinx/locale/__init__.py:161
+#: sphinx/locale/__init__.py:178
msgid "object"
msgstr "オブジェクト"
-#: sphinx/locale/__init__.py:163
+#: sphinx/locale/__init__.py:180
msgid "statement"
msgstr "文"
-#: sphinx/locale/__init__.py:164
+#: sphinx/locale/__init__.py:181
msgid "built-in function"
msgstr "組み込み関数"
@@ -511,8 +526,8 @@ msgstr "組み込み関数"
msgid "Table Of Contents"
msgstr "目次"
-#: sphinx/themes/agogo/layout.html:49 sphinx/themes/basic/layout.html:128
-#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:14
+#: sphinx/themes/agogo/layout.html:49 sphinx/themes/basic/layout.html:137
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:20
msgid "Search"
msgstr "検索"
@@ -560,15 +575,15 @@ msgstr "全モジュール早見表"
msgid "all functions, classes, terms"
msgstr "関数、クラスおよび用語総覧"
-#: sphinx/themes/basic/genindex-single.html:14
+#: sphinx/themes/basic/genindex-single.html:35
#, python-format
msgid "Index &ndash; %(key)s"
msgstr "索引 &ndash; %(key)s"
-#: sphinx/themes/basic/genindex-single.html:46
+#: sphinx/themes/basic/genindex-single.html:63
#: sphinx/themes/basic/genindex-split.html:24
#: sphinx/themes/basic/genindex-split.html:38
-#: sphinx/themes/basic/genindex.html:56
+#: sphinx/themes/basic/genindex.html:74
msgid "Full index on one page"
msgstr "総索引"
@@ -580,39 +595,39 @@ msgstr "頭文字別索引"
msgid "can be huge"
msgstr "大きい場合があるので注意"
-#: sphinx/themes/basic/layout.html:23
+#: sphinx/themes/basic/layout.html:29
msgid "Navigation"
msgstr "ナビゲーション"
-#: sphinx/themes/basic/layout.html:113
+#: sphinx/themes/basic/layout.html:122
#, python-format
msgid "Search within %(docstitle)s"
msgstr "%(docstitle)s 内を検索"
-#: sphinx/themes/basic/layout.html:122
+#: sphinx/themes/basic/layout.html:131
msgid "About these documents"
msgstr "このドキュメントについて"
-#: sphinx/themes/basic/layout.html:131
+#: sphinx/themes/basic/layout.html:140
msgid "Copyright"
msgstr "著作権"
-#: sphinx/themes/basic/layout.html:180
+#: sphinx/themes/basic/layout.html:189
#, python-format
msgid "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
msgstr "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
-#: sphinx/themes/basic/layout.html:182
+#: sphinx/themes/basic/layout.html:191
#, python-format
msgid "&copy; Copyright %(copyright)s."
msgstr "&copy; Copyright %(copyright)s."
-#: sphinx/themes/basic/layout.html:186
+#: sphinx/themes/basic/layout.html:195
#, python-format
msgid "Last updated on %(last_updated)s."
msgstr "最終更新: %(last_updated)s"
-#: sphinx/themes/basic/layout.html:189
+#: sphinx/themes/basic/layout.html:198
#, python-format
msgid ""
"Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
@@ -642,13 +657,13 @@ msgstr "次のトピックへ"
msgid "next chapter"
msgstr "次の章へ"
-#: sphinx/themes/basic/search.html:18
+#: sphinx/themes/basic/search.html:24
msgid ""
"Please activate JavaScript to enable the search\n"
" functionality."
msgstr "検索機能を使うには JavaScript を有効にしてください。"
-#: sphinx/themes/basic/search.html:23
+#: sphinx/themes/basic/search.html:29
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"
@@ -656,16 +671,15 @@ msgid ""
" containing fewer words won't appear in the result list."
msgstr "このページからドキュメントを検索できます。キーワードを下のボックスに入力して、「検索」をクリックしてください。入力された全てのキーワードを含むページが検索されます。一部のキーワードしか含まないページは検索結果に表示されないので注意してください。"
-#: sphinx/themes/basic/search.html:30
+#: sphinx/themes/basic/search.html:36
msgid "search"
msgstr "検索"
-#: sphinx/themes/basic/search.html:34
-#: sphinx/themes/basic/static/searchtools.js:489
+#: sphinx/themes/basic/search.html:40
msgid "Search Results"
msgstr "検索結果"
-#: sphinx/themes/basic/search.html:36
+#: sphinx/themes/basic/search.html:42
msgid "Your search did not match any results."
msgstr "検索条件に一致する項目がありませんでした。"
@@ -705,12 +719,12 @@ msgstr "C API に関する変更"
msgid "Other changes"
msgstr "その多の変更"
-#: sphinx/themes/basic/static/doctools.js:154 sphinx/writers/html.py:482
-#: sphinx/writers/html.py:487
+#: sphinx/themes/basic/static/doctools.js:154 sphinx/writers/html.py:504
+#: sphinx/writers/html.py:510
msgid "Permalink to this headline"
msgstr "このヘッドラインへのパーマリンク"
-#: sphinx/themes/basic/static/doctools.js:160 sphinx/writers/html.py:87
+#: sphinx/themes/basic/static/doctools.js:160 sphinx/writers/html.py:92
msgid "Permalink to this definition"
msgstr "この定義へのパーマリンク"
@@ -718,58 +732,37 @@ msgstr "この定義へのパーマリンク"
msgid "Hide Search Matches"
msgstr "検索結果を隠す"
-#: sphinx/themes/basic/static/searchtools.js:285
-msgid "Searching"
-msgstr "検索中"
-
-#: sphinx/themes/basic/static/searchtools.js:290
-msgid "Preparing search..."
-msgstr "検索の準備中..."
-
-#: sphinx/themes/basic/static/searchtools.js:364
-msgid ", in "
-msgstr ""
-
-#: sphinx/themes/basic/static/searchtools.js:491
-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/themes/basic/static/searchtools.js:493
-#, python-format
-msgid "Search finished, found %s page(s) matching the search query."
-msgstr "検索が終了し、条件に一致するページが %s 個みつかりました。"
-
-#: sphinx/themes/default/static/sidebar.js:66
+#: sphinx/themes/default/static/sidebar.js:69
msgid "Expand sidebar"
-msgstr ""
+msgstr "サイドバーを展開"
-#: sphinx/themes/default/static/sidebar.js:79
-#: sphinx/themes/default/static/sidebar.js:106
+#: sphinx/themes/default/static/sidebar.js:82
+#: sphinx/themes/default/static/sidebar.js:110
msgid "Collapse sidebar"
-msgstr ""
+msgstr "サイドバーをたたむ"
#: sphinx/themes/haiku/layout.html:26
msgid "Contents"
-msgstr ""
+msgstr "コンテンツ"
-#: sphinx/writers/latex.py:171
+#: sphinx/writers/latex.py:177
msgid "Release"
msgstr "リリース"
-#: sphinx/writers/latex.py:572 sphinx/writers/manpage.py:178
+#: sphinx/writers/latex.py:594 sphinx/writers/manpage.py:182
+#: sphinx/writers/texinfo.py:589
msgid "Footnotes"
msgstr "注記"
-#: sphinx/writers/latex.py:641
+#: sphinx/writers/latex.py:676
msgid "continued from previous page"
msgstr "前のページからの続き"
-#: sphinx/writers/latex.py:646
+#: sphinx/writers/latex.py:681
msgid "Continued on next page"
-msgstr "総索引"
+msgstr "次のページに続く"
-#: sphinx/writers/text.py:422
+#: sphinx/writers/text.py:437
msgid "[image]"
msgstr "[画像]"
+
diff --git a/sphinx/locale/ko/LC_MESSAGES/sphinx.js b/sphinx/locale/ko/LC_MESSAGES/sphinx.js
new file mode 100644
index 00000000..0beffaa2
--- /dev/null
+++ b/sphinx/locale/ko/LC_MESSAGES/sphinx.js
@@ -0,0 +1 @@
+Documentation.addTranslations({"locale": "ko", "plural_expr": "0", "messages": {"Hide Search Matches": "\uac80\uc0c9 \uacb0\uacfc \uc228\uae30\uae30", "Permalink to this definition": "\uc815\uc758 \uc8fc\uc18c", "Expand sidebar": "\uc0ac\uc774\ub4dc\ubc14 \uc5f4\uae30", "Permalink to this headline": "\uc81c\ubaa9 \uc8fc\uc18c", "Collapse sidebar": "\uc0ac\uc774\ub4dc\ubc14 \ub2eb\uae30"}}); \ No newline at end of file
diff --git a/sphinx/locale/ko/LC_MESSAGES/sphinx.mo b/sphinx/locale/ko/LC_MESSAGES/sphinx.mo
new file mode 100644
index 00000000..d671331a
--- /dev/null
+++ b/sphinx/locale/ko/LC_MESSAGES/sphinx.mo
Binary files differ
diff --git a/sphinx/locale/ko/LC_MESSAGES/sphinx.po b/sphinx/locale/ko/LC_MESSAGES/sphinx.po
new file mode 100644
index 00000000..8c0dd3d8
--- /dev/null
+++ b/sphinx/locale/ko/LC_MESSAGES/sphinx.po
@@ -0,0 +1,777 @@
+# Koreantranslations for Sphinx.
+# Copyright (C) 2008 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+# Channy Yun <channy@mozilla.or.kr>
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx 1.1pre\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2011-09-21 10:06+0200\n"
+"PO-Revision-Date: 2011-06-09 21:25+0900\n"
+"Last-Translator: Channy Yun <channy@mozilla.or.kr>\n"
+"Language-Team: Korean\n"
+"Plural-Forms: nplurals=1; plural=0\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 0.9.6\n"
+
+#: sphinx/config.py:81
+#, python-format
+msgid "%s %s documentation"
+msgstr ""
+
+#: sphinx/environment.py:119 sphinx/writers/latex.py:190
+#: sphinx/writers/manpage.py:67 sphinx/writers/texinfo.py:203
+#, python-format
+msgid "%B %d, %Y"
+msgstr "%Y년 %m월 %d일"
+
+#: sphinx/environment.py:1625
+#, python-format
+msgid "see %s"
+msgstr "%s 문서"
+
+#: sphinx/environment.py:1628
+#, python-format
+msgid "see also %s"
+msgstr "%s 참조"
+
+#: sphinx/roles.py:175
+#, python-format
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr "Python Enhancement Proposals; PEP %s"
+
+#: sphinx/builders/changes.py:73
+msgid "Builtins"
+msgstr "기본"
+
+#: sphinx/builders/changes.py:75
+msgid "Module level"
+msgstr "모듈 수준"
+
+#: sphinx/builders/html.py:274
+#, python-format
+msgid "%b %d, %Y"
+msgstr "%Y년 %m월 %d일"
+
+#: sphinx/builders/html.py:293 sphinx/themes/basic/defindex.html:30
+msgid "General Index"
+msgstr "전체 색인"
+
+#: sphinx/builders/html.py:293
+msgid "index"
+msgstr "색인"
+
+#: sphinx/builders/html.py:353
+msgid "next"
+msgstr "다음"
+
+#: sphinx/builders/html.py:362
+msgid "previous"
+msgstr "이전"
+
+#: sphinx/builders/latex.py:141 sphinx/builders/texinfo.py:196
+#, fuzzy
+msgid " (in "
+msgstr "("
+
+#: sphinx/directives/other.py:136
+#, fuzzy
+msgid "Section author: "
+msgstr "항목 저자:"
+
+#: sphinx/directives/other.py:138
+#, fuzzy
+msgid "Module author: "
+msgstr "모듈 개발자:"
+
+#: sphinx/directives/other.py:140
+#, fuzzy
+msgid "Code author: "
+msgstr "코드 개발자:"
+
+#: sphinx/directives/other.py:142
+#, fuzzy
+msgid "Author: "
+msgstr "저자:"
+
+#: sphinx/directives/other.py:215
+msgid "See also"
+msgstr "더 보기"
+
+#: sphinx/domains/__init__.py:244
+#, python-format
+msgid "%s %s"
+msgstr ""
+
+#: sphinx/domains/c.py:51 sphinx/domains/python.py:95
+msgid "Parameters"
+msgstr "매개 변수"
+
+#: sphinx/domains/c.py:54 sphinx/domains/javascript.py:128
+#: sphinx/domains/python.py:107
+msgid "Returns"
+msgstr "반환"
+
+#: sphinx/domains/c.py:56 sphinx/domains/python.py:109
+msgid "Return type"
+msgstr "반환 형식"
+
+#: sphinx/domains/c.py:141
+#, python-format
+msgid "%s (C function)"
+msgstr "%s (C 함수)"
+
+#: sphinx/domains/c.py:143
+#, python-format
+msgid "%s (C member)"
+msgstr "%s (C 멤버 변수)"
+
+#: sphinx/domains/c.py:145
+#, python-format
+msgid "%s (C macro)"
+msgstr "%s (C 매크로)"
+
+#: sphinx/domains/c.py:147
+#, python-format
+msgid "%s (C type)"
+msgstr "%s (C 데이터 형식)"
+
+#: sphinx/domains/c.py:149
+#, python-format
+msgid "%s (C variable)"
+msgstr "%s (C 변수)"
+
+#: sphinx/domains/c.py:204 sphinx/domains/cpp.py:1060
+#: sphinx/domains/javascript.py:162 sphinx/domains/python.py:559
+msgid "function"
+msgstr "함수"
+
+#: sphinx/domains/c.py:205 sphinx/domains/cpp.py:1061
+msgid "member"
+msgstr "멤버 변수"
+
+#: sphinx/domains/c.py:206
+msgid "macro"
+msgstr "매크로"
+
+#: sphinx/domains/c.py:207 sphinx/domains/cpp.py:1062
+msgid "type"
+msgstr "데이터 형식"
+
+#: sphinx/domains/c.py:208
+msgid "variable"
+msgstr "변수"
+
+#: sphinx/domains/cpp.py:904
+#, python-format
+msgid "%s (C++ class)"
+msgstr "%s (C++ 클래스)"
+
+#: sphinx/domains/cpp.py:919
+#, python-format
+msgid "%s (C++ type)"
+msgstr "%s (C++ 데이터 형식)"
+
+#: sphinx/domains/cpp.py:938
+#, python-format
+msgid "%s (C++ member)"
+msgstr "%s (C++의 멤버 변수)"
+
+#: sphinx/domains/cpp.py:990
+#, python-format
+msgid "%s (C++ function)"
+msgstr "%s (C++ 함수)"
+
+#: sphinx/domains/cpp.py:1059 sphinx/domains/javascript.py:163
+#: sphinx/domains/python.py:561
+msgid "class"
+msgstr "클래스"
+
+#: sphinx/domains/javascript.py:106 sphinx/domains/python.py:254
+#, python-format
+msgid "%s() (built-in function)"
+msgstr "%s() 내장 함수)"
+
+#: sphinx/domains/javascript.py:107 sphinx/domains/python.py:318
+#, python-format
+msgid "%s() (%s method)"
+msgstr "%s() (%s 메서드)"
+
+#: sphinx/domains/javascript.py:109
+#, python-format
+msgid "%s() (class)"
+msgstr "%s() (클래스)"
+
+#: sphinx/domains/javascript.py:111
+#, python-format
+msgid "%s (global variable or constant)"
+msgstr "%s (전역 변수 또는 상수)"
+
+#: sphinx/domains/javascript.py:113 sphinx/domains/python.py:356
+#, python-format
+msgid "%s (%s attribute)"
+msgstr "%s (%s의 속성)"
+
+#: sphinx/domains/javascript.py:122
+msgid "Arguments"
+msgstr "인수"
+
+#: sphinx/domains/javascript.py:125
+msgid "Throws"
+msgstr "예외"
+
+#: sphinx/domains/javascript.py:164 sphinx/domains/python.py:560
+msgid "data"
+msgstr "데이터"
+
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:566
+msgid "attribute"
+msgstr "속성"
+
+#: sphinx/domains/python.py:100
+msgid "Variables"
+msgstr "변수"
+
+#: sphinx/domains/python.py:104
+msgid "Raises"
+msgstr "예외"
+
+#: sphinx/domains/python.py:255 sphinx/domains/python.py:312
+#: sphinx/domains/python.py:324 sphinx/domains/python.py:337
+#, python-format
+msgid "%s() (in module %s)"
+msgstr "%s() (%s 모듈)"
+
+#: sphinx/domains/python.py:258
+#, python-format
+msgid "%s (built-in variable)"
+msgstr "%s (내장 변수)"
+
+#: sphinx/domains/python.py:259 sphinx/domains/python.py:350
+#, python-format
+msgid "%s (in module %s)"
+msgstr "%s (%s 모듈)"
+
+#: sphinx/domains/python.py:275
+#, python-format
+msgid "%s (built-in class)"
+msgstr "%s (내장 변수)"
+
+#: sphinx/domains/python.py:276
+#, python-format
+msgid "%s (class in %s)"
+msgstr "%s (%s 종류)"
+
+#: sphinx/domains/python.py:316
+#, fuzzy, python-format
+msgid "%s() (%s.%s method)"
+msgstr "%s() (%s. %s 메서드)"
+
+#: sphinx/domains/python.py:328
+#, fuzzy, python-format
+msgid "%s() (%s.%s static method)"
+msgstr "%s() (%s. %s의 정적 메서드)"
+
+#: sphinx/domains/python.py:331
+#, python-format
+msgid "%s() (%s static method)"
+msgstr "%s() (%s의 정적 메서드)"
+
+#: sphinx/domains/python.py:341
+#, fuzzy, python-format
+msgid "%s() (%s.%s class method)"
+msgstr "%s() (%s. %s 클래스 메서드)"
+
+#: sphinx/domains/python.py:344
+#, python-format
+msgid "%s() (%s class method)"
+msgstr "%s() (%s 클래스 메서드)"
+
+#: sphinx/domains/python.py:354
+#, fuzzy, python-format
+msgid "%s (%s.%s attribute)"
+msgstr "%s (%s. %s의 속성)"
+
+#: sphinx/domains/python.py:434
+#, python-format
+msgid "%s (module)"
+msgstr "%s (모듈)"
+
+#: sphinx/domains/python.py:491
+msgid "Python Module Index"
+msgstr "Python 모듈 목록"
+
+#: sphinx/domains/python.py:492
+msgid "modules"
+msgstr "모듈"
+
+#: sphinx/domains/python.py:537
+msgid "Deprecated"
+msgstr "폐지"
+
+#: sphinx/domains/python.py:562 sphinx/locale/__init__.py:179
+msgid "exception"
+msgstr "예외"
+
+#: sphinx/domains/python.py:563
+msgid "method"
+msgstr "메소드"
+
+#: sphinx/domains/python.py:564
+msgid "class method"
+msgstr "클래스 메소드"
+
+#: sphinx/domains/python.py:565
+msgid "static method"
+msgstr "정적 메서드"
+
+#: sphinx/domains/python.py:567 sphinx/locale/__init__.py:175
+msgid "module"
+msgstr "모듈"
+
+#: sphinx/domains/python.py:695
+#, fuzzy
+msgid " (deprecated)"
+msgstr "(폐지)"
+
+#: sphinx/domains/rst.py:55
+#, python-format
+msgid "%s (directive)"
+msgstr "%s (지시문)"
+
+#: sphinx/domains/rst.py:57
+#, python-format
+msgid "%s (role)"
+msgstr "%s (역할)"
+
+#: sphinx/domains/rst.py:106
+msgid "directive"
+msgstr "지시자"
+
+#: sphinx/domains/rst.py:107
+msgid "role"
+msgstr "역할"
+
+#: sphinx/domains/std.py:70 sphinx/domains/std.py:86
+#, python-format
+msgid "environment variable; %s"
+msgstr "환경 변수; %s"
+
+#: sphinx/domains/std.py:162
+#, python-format
+msgid "%scommand line option; %s"
+msgstr "%s 명령; %s"
+
+#: sphinx/domains/std.py:393
+msgid "glossary term"
+msgstr "용어의 항목"
+
+#: sphinx/domains/std.py:394
+msgid "grammar token"
+msgstr "문법 토큰"
+
+#: sphinx/domains/std.py:395
+msgid "reference label"
+msgstr "참조 레이블"
+
+#: sphinx/domains/std.py:396
+msgid "environment variable"
+msgstr "환경 변수"
+
+#: sphinx/domains/std.py:397
+msgid "program option"
+msgstr "프로그램 옵션"
+
+#: sphinx/domains/std.py:427 sphinx/themes/basic/genindex-single.html:32
+#: sphinx/themes/basic/genindex-split.html:11
+#: sphinx/themes/basic/genindex-split.html:14
+#: sphinx/themes/basic/genindex.html:32 sphinx/themes/basic/genindex.html:35
+#: sphinx/themes/basic/genindex.html:68 sphinx/themes/basic/layout.html:134
+#: sphinx/writers/latex.py:179 sphinx/writers/texinfo.py:456
+msgid "Index"
+msgstr "색인"
+
+#: sphinx/domains/std.py:428
+msgid "Module Index"
+msgstr "모듈 목록"
+
+#: sphinx/domains/std.py:429 sphinx/themes/basic/defindex.html:25
+msgid "Search Page"
+msgstr "검색 페이지"
+
+#: sphinx/ext/autodoc.py:1002
+#, fuzzy, python-format
+msgid " Bases: %s"
+msgstr "기본 클래스: %s"
+
+#: sphinx/ext/autodoc.py:1038
+#, fuzzy, python-format
+msgid "alias of :class:`%s`"
+msgstr ": class:`%s`의 별칭"
+
+#: sphinx/ext/todo.py:41
+msgid "Todo"
+msgstr "과제"
+
+#: sphinx/ext/todo.py:109
+#, fuzzy, python-format
+msgid "(The <<original entry>> is located in %s, line %d.)"
+msgstr "(<<원래 항목\" \"는 %s %d 번째)"
+
+#: sphinx/ext/todo.py:117
+msgid "original entry"
+msgstr "원래 항목"
+
+#: sphinx/ext/viewcode.py:70
+msgid "[source]"
+msgstr "[소스]"
+
+#: sphinx/ext/viewcode.py:117
+msgid "[docs]"
+msgstr "[문서]"
+
+#: sphinx/ext/viewcode.py:131
+msgid "Module code"
+msgstr "모듈 코드"
+
+#: sphinx/ext/viewcode.py:137
+#, fuzzy, python-format
+msgid "<h1>Source code for %s</h1>"
+msgstr "<h1>%s의 소스 코드</ h1>"
+
+#: sphinx/ext/viewcode.py:164
+msgid "Overview: module code"
+msgstr "설명: 모듈 코드"
+
+#: sphinx/ext/viewcode.py:165
+#, fuzzy
+msgid "<h1>All modules for which code is available</h1>"
+msgstr "<h1>코드가 제공되는 모든 모듈 </ h1>"
+
+#: sphinx/locale/__init__.py:155
+msgid "Attention"
+msgstr "주의"
+
+#: sphinx/locale/__init__.py:156
+msgid "Caution"
+msgstr "조심"
+
+#: sphinx/locale/__init__.py:157
+msgid "Danger"
+msgstr "위험"
+
+#: sphinx/locale/__init__.py:158
+msgid "Error"
+msgstr "오류"
+
+#: sphinx/locale/__init__.py:159
+msgid "Hint"
+msgstr "힌트"
+
+#: sphinx/locale/__init__.py:160
+msgid "Important"
+msgstr "중요"
+
+#: sphinx/locale/__init__.py:161
+msgid "Note"
+msgstr "주석"
+
+#: sphinx/locale/__init__.py:162
+msgid "See Also"
+msgstr "더 보기"
+
+#: sphinx/locale/__init__.py:163
+msgid "Tip"
+msgstr "참고"
+
+#: sphinx/locale/__init__.py:164
+msgid "Warning"
+msgstr "경고"
+
+#: sphinx/locale/__init__.py:168
+#, python-format
+msgid "New in version %s"
+msgstr "버전 %s에 추가"
+
+#: sphinx/locale/__init__.py:169
+#, python-format
+msgid "Changed in version %s"
+msgstr "버전 %s으로 변경"
+
+#: sphinx/locale/__init__.py:170
+#, python-format
+msgid "Deprecated since version %s"
+msgstr "버전 %s 폐지"
+
+#: sphinx/locale/__init__.py:176
+msgid "keyword"
+msgstr "키워드"
+
+#: sphinx/locale/__init__.py:177
+msgid "operator"
+msgstr "연산자"
+
+#: sphinx/locale/__init__.py:178
+msgid "object"
+msgstr "객체"
+
+#: sphinx/locale/__init__.py:180
+msgid "statement"
+msgstr "글"
+
+#: sphinx/locale/__init__.py:181
+msgid "built-in function"
+msgstr "내장 함수"
+
+#: sphinx/themes/agogo/layout.html:45 sphinx/themes/basic/globaltoc.html:10
+#: sphinx/themes/basic/localtoc.html:11
+msgid "Table Of Contents"
+msgstr "목차"
+
+#: sphinx/themes/agogo/layout.html:49 sphinx/themes/basic/layout.html:137
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:20
+msgid "Search"
+msgstr "검색"
+
+#: sphinx/themes/agogo/layout.html:52 sphinx/themes/basic/searchbox.html:15
+msgid "Go"
+msgstr "바로 가기"
+
+#: sphinx/themes/agogo/layout.html:57 sphinx/themes/basic/searchbox.html:20
+msgid "Enter search terms or a module, class or function name."
+msgstr "모듈, 클래스 또는 함수 이름을 입력하십시오."
+
+#: sphinx/themes/agogo/layout.html:78 sphinx/themes/basic/sourcelink.html:14
+msgid "Show Source"
+msgstr "소스 코드를 보려면"
+
+#: sphinx/themes/basic/defindex.html:11
+msgid "Overview"
+msgstr "개요"
+
+#: sphinx/themes/basic/defindex.html:20
+msgid "Indices and tables:"
+msgstr "색인 및 표 목록:"
+
+#: sphinx/themes/basic/defindex.html:23
+msgid "Complete Table of Contents"
+msgstr "종합 목차"
+
+#: sphinx/themes/basic/defindex.html:24
+msgid "lists all sections and subsections"
+msgstr "영역별 목차"
+
+#: sphinx/themes/basic/defindex.html:26
+msgid "search this documentation"
+msgstr "문서 검색"
+
+#: sphinx/themes/basic/defindex.html:28
+msgid "Global Module Index"
+msgstr "모듈 총 색인"
+
+#: sphinx/themes/basic/defindex.html:29
+msgid "quick access to all modules"
+msgstr "모든 모듈 조견표"
+
+#: sphinx/themes/basic/defindex.html:31
+msgid "all functions, classes, terms"
+msgstr "함수, 클래스 및 용어 개관"
+
+#: sphinx/themes/basic/genindex-single.html:35
+#, fuzzy, python-format
+msgid "Index &ndash; %(key)s"
+msgstr "색인-%(key)s"
+
+#: sphinx/themes/basic/genindex-single.html:63
+#: sphinx/themes/basic/genindex-split.html:24
+#: sphinx/themes/basic/genindex-split.html:38
+#: sphinx/themes/basic/genindex.html:74
+msgid "Full index on one page"
+msgstr "일반 색인"
+
+#: sphinx/themes/basic/genindex-split.html:16
+msgid "Index pages by letter"
+msgstr "알파벳별 색인"
+
+#: sphinx/themes/basic/genindex-split.html:25
+msgid "can be huge"
+msgstr "큰 경우가 있으므로 주의"
+
+#: sphinx/themes/basic/layout.html:29
+msgid "Navigation"
+msgstr "탐색"
+
+#: sphinx/themes/basic/layout.html:122
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr "%(docstitle)s에서 찾기"
+
+#: sphinx/themes/basic/layout.html:131
+msgid "About these documents"
+msgstr "이 문서 정보"
+
+#: sphinx/themes/basic/layout.html:140
+msgid "Copyright"
+msgstr "저작권"
+
+#: sphinx/themes/basic/layout.html:189
+#, fuzzy, python-format
+msgid "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
+msgstr "©<a href=\"%(path)s\">Copyright</a> %(copyright)s."
+
+#: sphinx/themes/basic/layout.html:191
+#, fuzzy, python-format
+msgid "&copy; Copyright %(copyright)s."
+msgstr "©Copyright %(copyright)s."
+
+#: sphinx/themes/basic/layout.html:195
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr "최종 업데이트: %(last_updated)s"
+
+#: sphinx/themes/basic/layout.html:198
+#, fuzzy, python-format
+msgid ""
+"Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+"이 문서는 <a href=\"http://sphinx.pocoo.org/\">Sphinx</a>%(sphinx_version)s로 "
+"제공됩니다."
+
+#: sphinx/themes/basic/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr "%(docstitle)s에서 찾기"
+
+#: sphinx/themes/basic/relations.html:11
+msgid "Previous topic"
+msgstr "이전 항목"
+
+#: sphinx/themes/basic/relations.html:13
+msgid "previous chapter"
+msgstr "이전 장"
+
+#: sphinx/themes/basic/relations.html:16
+msgid "Next topic"
+msgstr "다음 항목"
+
+#: sphinx/themes/basic/relations.html:18
+msgid "next chapter"
+msgstr "다음 장"
+
+#: sphinx/themes/basic/search.html:24
+#, fuzzy
+msgid ""
+"Please activate JavaScript to enable the search\n"
+" functionality."
+msgstr "검색 기능을 사용하려면 JavaScript를 활성화하십시오."
+
+#: sphinx/themes/basic/search.html:29
+#, fuzzy
+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 ""
+"이 문서에서 문서를 검색할 수 있습니다. 키워드를 아래 입력란에 입력하고 '검색'을 클릭하세요. 입력된 모든 키워드를 포함하는 "
+"페이지가 검색됩니다. 일부 키워드 밖에 없는 페이지는 검색 결과에 표시되지 않으므로 주의하십시오. "
+
+#: sphinx/themes/basic/search.html:36
+msgid "search"
+msgstr "검색"
+
+#: sphinx/themes/basic/search.html:40
+msgid "Search Results"
+msgstr "검색 결과"
+
+#: sphinx/themes/basic/search.html:42
+msgid "Your search did not match any results."
+msgstr "검색 조건에 일치하는 항목이 없습니다."
+
+#: sphinx/themes/basic/searchbox.html:12
+msgid "Quick search"
+msgstr "빠른 검색"
+
+#: sphinx/themes/basic/sourcelink.html:11
+msgid "This Page"
+msgstr "현재 문서"
+
+#: sphinx/themes/basic/changes/frameset.html:5
+#: sphinx/themes/basic/changes/versionchanges.html:12
+#, fuzzy, python-format
+msgid "Changes in Version %(version)s &mdash; %(docstitle)s"
+msgstr "버전 %(version)s의 변경 사항-%(docstitle)s"
+
+#: sphinx/themes/basic/changes/rstsource.html:5
+#, fuzzy, python-format
+msgid "%(filename)s &mdash; %(docstitle)s"
+msgstr "%(filename)s-%(docstitle)s"
+
+#: sphinx/themes/basic/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr "버전 %(version)s의 변경 사항 (이 목록은 자동으로 생성합니다)"
+
+#: sphinx/themes/basic/changes/versionchanges.html:18
+msgid "Library changes"
+msgstr "라이브러리에 대한 변경"
+
+#: sphinx/themes/basic/changes/versionchanges.html:23
+msgid "C API changes"
+msgstr "C API에 대한 변경"
+
+#: sphinx/themes/basic/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr "다른 변경 사항"
+
+#: sphinx/themes/basic/static/doctools.js:154 sphinx/writers/html.py:504
+#: sphinx/writers/html.py:510
+msgid "Permalink to this headline"
+msgstr "제목 주소"
+
+#: sphinx/themes/basic/static/doctools.js:160 sphinx/writers/html.py:92
+msgid "Permalink to this definition"
+msgstr "정의 주소"
+
+#: sphinx/themes/basic/static/doctools.js:189
+msgid "Hide Search Matches"
+msgstr "검색 결과 숨기기"
+
+#: sphinx/themes/default/static/sidebar.js:69
+msgid "Expand sidebar"
+msgstr "사이드바 열기"
+
+#: sphinx/themes/default/static/sidebar.js:82
+#: sphinx/themes/default/static/sidebar.js:110
+msgid "Collapse sidebar"
+msgstr "사이드바 닫기"
+
+#: sphinx/themes/haiku/layout.html:26
+msgid "Contents"
+msgstr "내용"
+
+#: sphinx/writers/latex.py:177
+msgid "Release"
+msgstr "출시"
+
+#: sphinx/writers/latex.py:594 sphinx/writers/manpage.py:182
+#: sphinx/writers/texinfo.py:589
+msgid "Footnotes"
+msgstr "참고"
+
+#: sphinx/writers/latex.py:676
+msgid "continued from previous page"
+msgstr "이전 페이지에서 계속"
+
+#: sphinx/writers/latex.py:681
+msgid "Continued on next page"
+msgstr "일반 색인"
+
+#: sphinx/writers/text.py:437
+msgid "[image]"
+msgstr "[그림]"
+
diff --git a/sphinx/locale/lt/LC_MESSAGES/sphinx.js b/sphinx/locale/lt/LC_MESSAGES/sphinx.js
index daf4f89b..2ab4266b 100644
--- a/sphinx/locale/lt/LC_MESSAGES/sphinx.js
+++ b/sphinx/locale/lt/LC_MESSAGES/sphinx.js
@@ -1 +1 @@
-Documentation.addTranslations({"locale": "lt", "plural_expr": "(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2)", "messages": {"Search Results": "Paie\u0161kos rezultatai", "Preparing search...": "Ruo\u0161iama paie\u0161ka...", "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "J\u016bs\u0173 paie\u0161ka neatitiko joki\u0173 dokument\u0173. Pra\u0161om patikrinti ar visi \u017eod\u017eiai teisingai \u012fvesti ir ar pasirinkote pakankamai kategorij\u0173.", "Search finished, found %s page(s) matching the search query.": "Paie\u0161ka baigta, paie\u0161kos rezultatus atitiko %s puslapis(-iai,-i\u0173)", ", in ": ", kuris yra ", "Expand sidebar": "I\u0161pl\u0117sti \u0161onin\u0119 juost\u0105", "Permalink to this headline": "Nuoroda \u012f \u0161i\u0105 antra\u0161t\u0119", "Searching": "Ie\u0161koma", "Collapse sidebar": "Pasl\u0117pti \u0161onin\u0119 juost\u0105", "Permalink to this definition": "Nuoroda \u012f \u0161\u012f apibr\u0117\u017eim\u0105", "Hide Search Matches": "Pasl\u0117pti paie\u0161kos rezultatus"}}); \ No newline at end of file
+Documentation.addTranslations({"locale": "lt", "plural_expr": "(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2)", "messages": {"Hide Search Matches": "Pasl\u0117pti paie\u0161kos rezultatus", "Permalink to this definition": "Nuoroda \u012f \u0161\u012f apibr\u0117\u017eim\u0105", "Expand sidebar": "I\u0161pl\u0117sti \u0161onin\u0119 juost\u0105", "Permalink to this headline": "Nuoroda \u012f \u0161i\u0105 antra\u0161t\u0119", "Collapse sidebar": "Pasl\u0117pti \u0161onin\u0119 juost\u0105"}}); \ No newline at end of file
diff --git a/sphinx/locale/lt/LC_MESSAGES/sphinx.mo b/sphinx/locale/lt/LC_MESSAGES/sphinx.mo
index 794ae655..9efc6d77 100644
--- a/sphinx/locale/lt/LC_MESSAGES/sphinx.mo
+++ b/sphinx/locale/lt/LC_MESSAGES/sphinx.mo
Binary files differ
diff --git a/sphinx/locale/lt/LC_MESSAGES/sphinx.po b/sphinx/locale/lt/LC_MESSAGES/sphinx.po
index 48618e30..b331d52a 100644
--- a/sphinx/locale/lt/LC_MESSAGES/sphinx.po
+++ b/sphinx/locale/lt/LC_MESSAGES/sphinx.po
@@ -6,380 +6,402 @@ msgid ""
msgstr ""
"Project-Id-Version: Sphinx 1.0pre/8b971dbc7d36\n"
"Report-Msgid-Bugs-To: dalius@sandbox.lt\n"
-"POT-Creation-Date: 2010-05-24 23:53+0200\n"
-"PO-Revision-Date: 2010-06-19 12:02+0300\n"
+"POT-Creation-Date: 2011-09-21 10:06+0200\n"
+"PO-Revision-Date: 2011-01-22 14:41+0100\n"
"Last-Translator: Dalius Dobravolskas <dalius@sandbox.lt>\n"
+"Language-Team: lt <LL@li.org>\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
"(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.5\n"
+"Generated-By: Babel 0.9.6\n"
-#: sphinx/environment.py:106 sphinx/writers/latex.py:184
-#: sphinx/writers/manpage.py:67
+#: sphinx/config.py:81
+#, python-format
+msgid "%s %s documentation"
+msgstr ""
+
+#: sphinx/environment.py:119 sphinx/writers/latex.py:190
+#: sphinx/writers/manpage.py:67 sphinx/writers/texinfo.py:203
#, python-format
msgid "%B %d, %Y"
msgstr "%Y-%m-%d"
-#: sphinx/roles.py:174
+#: sphinx/environment.py:1625
+#, python-format
+msgid "see %s"
+msgstr ""
+
+#: sphinx/environment.py:1628
#, python-format
-msgid "Python Enhancement Proposals!PEP %s"
+msgid "see also %s"
msgstr ""
-#: sphinx/builders/changes.py:72
+#: sphinx/roles.py:175
+#, python-format
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr "Python Enhancement Proposals; PEP %s"
+
+#: sphinx/builders/changes.py:73
msgid "Builtins"
msgstr "Įtaisytieji"
-#: sphinx/builders/changes.py:74
+#: sphinx/builders/changes.py:75
msgid "Module level"
msgstr "Modulio lygis"
-#: sphinx/builders/html.py:266
+#: sphinx/builders/html.py:274
#, python-format
msgid "%b %d, %Y"
msgstr "%Y-%m-%d"
-#: sphinx/builders/html.py:285 sphinx/themes/basic/defindex.html:30
+#: sphinx/builders/html.py:293 sphinx/themes/basic/defindex.html:30
msgid "General Index"
msgstr "Bendras indeksas"
-#: sphinx/builders/html.py:285
+#: sphinx/builders/html.py:293
msgid "index"
msgstr "indeksas"
-#: sphinx/builders/html.py:345
+#: sphinx/builders/html.py:353
msgid "next"
msgstr "kitas"
-#: sphinx/builders/html.py:354
+#: sphinx/builders/html.py:362
msgid "previous"
msgstr "praeitas"
-#: sphinx/builders/latex.py:151
+#: sphinx/builders/latex.py:141 sphinx/builders/texinfo.py:196
msgid " (in "
msgstr " (kuris yra "
-#: sphinx/directives/other.py:127
+#: sphinx/directives/other.py:136
msgid "Section author: "
msgstr "Skyriaus autorius: "
-#: sphinx/directives/other.py:129
+#: sphinx/directives/other.py:138
msgid "Module author: "
msgstr "Modulio autorius: "
-#: sphinx/directives/other.py:131
+#: sphinx/directives/other.py:140
msgid "Code author: "
msgstr "Kodo autorius: "
-#: sphinx/directives/other.py:133
+#: sphinx/directives/other.py:142
msgid "Author: "
msgstr "Autorius: "
-#: sphinx/directives/other.py:238
+#: sphinx/directives/other.py:215
msgid "See also"
msgstr "Taip pat žiūrėkite"
-#: sphinx/domains/__init__.py:253
+#: sphinx/domains/__init__.py:244
#, python-format
msgid "%s %s"
msgstr "%s %s"
-#: sphinx/domains/c.py:51 sphinx/domains/python.py:49
+#: sphinx/domains/c.py:51 sphinx/domains/python.py:95
msgid "Parameters"
msgstr "Parametrai"
-#: sphinx/domains/c.py:54 sphinx/domains/javascript.py:137
-#: sphinx/domains/python.py:59
+#: sphinx/domains/c.py:54 sphinx/domains/javascript.py:128
+#: sphinx/domains/python.py:107
msgid "Returns"
msgstr "Grąžinamos reikšmės"
-#: sphinx/domains/c.py:56 sphinx/domains/python.py:61
+#: sphinx/domains/c.py:56 sphinx/domains/python.py:109
msgid "Return type"
msgstr "Grąžinamos reikšmės tipas"
-#: sphinx/domains/c.py:133
+#: sphinx/domains/c.py:141
#, python-format
msgid "%s (C function)"
msgstr "%s (C funkcija)"
-#: sphinx/domains/c.py:135
+#: sphinx/domains/c.py:143
#, python-format
msgid "%s (C member)"
msgstr "%s (C narys)"
-#: sphinx/domains/c.py:137
+#: sphinx/domains/c.py:145
#, python-format
msgid "%s (C macro)"
msgstr "%s (C makrokomanda)"
-#: sphinx/domains/c.py:139
+#: sphinx/domains/c.py:147
#, python-format
msgid "%s (C type)"
msgstr "%s (C tipas)"
-#: sphinx/domains/c.py:141
+#: sphinx/domains/c.py:149
#, python-format
msgid "%s (C variable)"
msgstr "%s (C kintamasis)"
-#: sphinx/domains/c.py:171 sphinx/domains/cpp.py:1031
-#: sphinx/domains/javascript.py:166 sphinx/domains/python.py:497
+#: sphinx/domains/c.py:204 sphinx/domains/cpp.py:1060
+#: sphinx/domains/javascript.py:162 sphinx/domains/python.py:559
msgid "function"
msgstr "funkcija"
-#: sphinx/domains/c.py:172 sphinx/domains/cpp.py:1032
+#: sphinx/domains/c.py:205 sphinx/domains/cpp.py:1061
msgid "member"
msgstr "narys"
-#: sphinx/domains/c.py:173
+#: sphinx/domains/c.py:206
msgid "macro"
msgstr "makrokomanda"
-#: sphinx/domains/c.py:174 sphinx/domains/cpp.py:1033
+#: sphinx/domains/c.py:207 sphinx/domains/cpp.py:1062
msgid "type"
msgstr "tipas"
-#: sphinx/domains/c.py:175
+#: sphinx/domains/c.py:208
msgid "variable"
msgstr "kintamasis"
-#: sphinx/domains/cpp.py:876
+#: sphinx/domains/cpp.py:904
#, python-format
msgid "%s (C++ class)"
msgstr ""
-#: sphinx/domains/cpp.py:891
+#: sphinx/domains/cpp.py:919
#, python-format
msgid "%s (C++ type)"
msgstr "%s (C++ tipas)"
-#: sphinx/domains/cpp.py:910
+#: sphinx/domains/cpp.py:938
#, python-format
msgid "%s (C++ member)"
msgstr "%s (C++ narys)"
-#: sphinx/domains/cpp.py:962
+#: sphinx/domains/cpp.py:990
#, python-format
msgid "%s (C++ function)"
msgstr "%s (C++ funkcija)"
-#: sphinx/domains/cpp.py:1030 sphinx/domains/python.py:499
+#: sphinx/domains/cpp.py:1059 sphinx/domains/javascript.py:163
+#: sphinx/domains/python.py:561
msgid "class"
msgstr "klasė"
-#: sphinx/domains/javascript.py:117 sphinx/domains/python.py:221
+#: sphinx/domains/javascript.py:106 sphinx/domains/python.py:254
#, python-format
msgid "%s() (built-in function)"
msgstr "%s() (itaisytoji funkcija)"
-#: sphinx/domains/javascript.py:118 sphinx/domains/python.py:285
+#: sphinx/domains/javascript.py:107 sphinx/domains/python.py:318
#, python-format
msgid "%s() (%s method)"
msgstr "%s() (%s metodas)"
-#: sphinx/domains/javascript.py:120
+#: sphinx/domains/javascript.py:109
+#, python-format
+msgid "%s() (class)"
+msgstr "%s() (klasė)"
+
+#: sphinx/domains/javascript.py:111
#, python-format
msgid "%s (global variable or constant)"
msgstr "%s (globalus kintamasis arba konstanta)"
-#: sphinx/domains/javascript.py:122 sphinx/domains/python.py:323
+#: sphinx/domains/javascript.py:113 sphinx/domains/python.py:356
#, python-format
msgid "%s (%s attribute)"
msgstr "%s (%s atributas)"
-#: sphinx/domains/javascript.py:131
+#: sphinx/domains/javascript.py:122
msgid "Arguments"
msgstr "Argumentais"
-#: sphinx/domains/javascript.py:134
+#: sphinx/domains/javascript.py:125
msgid "Throws"
msgstr "Išmeta"
-#: sphinx/domains/javascript.py:167 sphinx/domains/python.py:498
+#: sphinx/domains/javascript.py:164 sphinx/domains/python.py:560
msgid "data"
msgstr "duomenys"
-#: sphinx/domains/javascript.py:168 sphinx/domains/python.py:504
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:566
msgid "attribute"
msgstr "atribudas"
-#: sphinx/domains/python.py:53
+#: sphinx/domains/python.py:100
msgid "Variables"
msgstr "Kintamieji"
-#: sphinx/domains/python.py:56
+#: sphinx/domains/python.py:104
msgid "Raises"
msgstr "Sukelia"
-#: sphinx/domains/python.py:222 sphinx/domains/python.py:279
-#: sphinx/domains/python.py:291 sphinx/domains/python.py:304
+#: sphinx/domains/python.py:255 sphinx/domains/python.py:312
+#: sphinx/domains/python.py:324 sphinx/domains/python.py:337
#, python-format
msgid "%s() (in module %s)"
msgstr "%s() (modulyje %s)"
-#: sphinx/domains/python.py:225
+#: sphinx/domains/python.py:258
#, python-format
msgid "%s (built-in variable)"
msgstr "%s (įtaisytasis kintamasis)"
-#: sphinx/domains/python.py:226 sphinx/domains/python.py:317
+#: sphinx/domains/python.py:259 sphinx/domains/python.py:350
#, python-format
msgid "%s (in module %s)"
msgstr "%s (modulje %s)"
-#: sphinx/domains/python.py:242
+#: sphinx/domains/python.py:275
#, python-format
msgid "%s (built-in class)"
msgstr "%s (įtaisytoji klasė)"
-#: sphinx/domains/python.py:243
+#: sphinx/domains/python.py:276
#, python-format
msgid "%s (class in %s)"
msgstr "%s (klasė iš %s)"
-#: sphinx/domains/python.py:283
+#: sphinx/domains/python.py:316
#, python-format
msgid "%s() (%s.%s method)"
msgstr "%s() (%s.%s metodas)"
-#: sphinx/domains/python.py:295
+#: sphinx/domains/python.py:328
#, python-format
msgid "%s() (%s.%s static method)"
msgstr "%s() (%s.%s statinis metodas)"
-#: sphinx/domains/python.py:298
+#: sphinx/domains/python.py:331
#, python-format
msgid "%s() (%s static method)"
msgstr "%s() (%s statinis metodas)"
-#: sphinx/domains/python.py:308
+#: sphinx/domains/python.py:341
#, python-format
msgid "%s() (%s.%s class method)"
msgstr "%s() (%s.%s klasės metodas)"
-#: sphinx/domains/python.py:311
+#: sphinx/domains/python.py:344
#, python-format
msgid "%s() (%s class method)"
msgstr "%s() (%s klasės metodas)"
-#: sphinx/domains/python.py:321
+#: sphinx/domains/python.py:354
#, python-format
msgid "%s (%s.%s attribute)"
msgstr "%s (%s.%s atributas)"
-#: sphinx/domains/python.py:366
-msgid "Platforms: "
-msgstr "Platformos: "
-
-#: sphinx/domains/python.py:372
+#: sphinx/domains/python.py:434
#, python-format
msgid "%s (module)"
msgstr "%s (modulis)"
-#: sphinx/domains/python.py:429
+#: sphinx/domains/python.py:491
msgid "Python Module Index"
msgstr ""
-#: sphinx/domains/python.py:430
+#: sphinx/domains/python.py:492
msgid "modules"
msgstr "moduliai"
-#: sphinx/domains/python.py:475
+#: sphinx/domains/python.py:537
msgid "Deprecated"
msgstr "Atmestas"
-#: sphinx/domains/python.py:500 sphinx/locale/__init__.py:162
+#: sphinx/domains/python.py:562 sphinx/locale/__init__.py:179
msgid "exception"
msgstr "išimtis"
-#: sphinx/domains/python.py:501
+#: sphinx/domains/python.py:563
msgid "method"
msgstr "metodas"
-#: sphinx/domains/python.py:502
+#: sphinx/domains/python.py:564
msgid "class method"
msgstr "klasės metodas"
-#: sphinx/domains/python.py:503
+#: sphinx/domains/python.py:565
msgid "static method"
msgstr "statinis metodas"
-#: sphinx/domains/python.py:505 sphinx/locale/__init__.py:158
+#: sphinx/domains/python.py:567 sphinx/locale/__init__.py:175
msgid "module"
msgstr "modulis"
-#: sphinx/domains/rst.py:53
+#: sphinx/domains/python.py:695
+msgid " (deprecated)"
+msgstr " (atmestas)"
+
+#: sphinx/domains/rst.py:55
#, python-format
msgid "%s (directive)"
msgstr "%s (direktyva)"
-#: sphinx/domains/rst.py:55
+#: sphinx/domains/rst.py:57
#, python-format
msgid "%s (role)"
msgstr "%s (rolė)"
-#: sphinx/domains/rst.py:103
+#: sphinx/domains/rst.py:106
msgid "directive"
msgstr "direktyva"
-#: sphinx/domains/rst.py:104
+#: sphinx/domains/rst.py:107
msgid "role"
msgstr "rolė"
-#: sphinx/domains/std.py:68 sphinx/domains/std.py:84
+#: sphinx/domains/std.py:70 sphinx/domains/std.py:86
#, python-format
msgid "environment variable; %s"
msgstr "aplinkos kintamasis; %s"
-#: sphinx/domains/std.py:160
+#: sphinx/domains/std.py:162
#, python-format
msgid "%scommand line option; %s"
msgstr "%skomandinės eilutės parinktis; %s"
-#: sphinx/domains/std.py:328
+#: sphinx/domains/std.py:393
msgid "glossary term"
msgstr "aiškinamasis terminas"
-#: sphinx/domains/std.py:329
+#: sphinx/domains/std.py:394
msgid "grammar token"
msgstr "gramatinė leksema"
-#: sphinx/domains/std.py:330
+#: sphinx/domains/std.py:395
msgid "reference label"
msgstr "nuorodos požymis"
-#: sphinx/domains/std.py:331
+#: sphinx/domains/std.py:396
msgid "environment variable"
msgstr "aplinkos kintamasis"
-#: sphinx/domains/std.py:332
+#: sphinx/domains/std.py:397
msgid "program option"
msgstr "programos parinktis"
-#: sphinx/domains/std.py:360 sphinx/themes/basic/genindex-single.html:11
+#: sphinx/domains/std.py:427 sphinx/themes/basic/genindex-single.html:32
#: sphinx/themes/basic/genindex-split.html:11
#: sphinx/themes/basic/genindex-split.html:14
-#: sphinx/themes/basic/genindex.html:11 sphinx/themes/basic/genindex.html:14
-#: sphinx/themes/basic/genindex.html:50 sphinx/themes/basic/layout.html:125
-#: sphinx/writers/latex.py:173
+#: sphinx/themes/basic/genindex.html:32 sphinx/themes/basic/genindex.html:35
+#: sphinx/themes/basic/genindex.html:68 sphinx/themes/basic/layout.html:134
+#: sphinx/writers/latex.py:179 sphinx/writers/texinfo.py:456
msgid "Index"
msgstr "Indeksas"
-#: sphinx/domains/std.py:361
+#: sphinx/domains/std.py:428
msgid "Module Index"
msgstr "Modulio indeksas"
-#: sphinx/domains/std.py:362 sphinx/themes/basic/defindex.html:25
+#: sphinx/domains/std.py:429 sphinx/themes/basic/defindex.html:25
msgid "Search Page"
msgstr "Paieškos puslapis"
-#: sphinx/ext/autodoc.py:917
+#: sphinx/ext/autodoc.py:1002
#, python-format
msgid " Bases: %s"
msgstr " Bazės: %s"
-#: sphinx/ext/autodoc.py:950
+#: sphinx/ext/autodoc.py:1038
#, python-format
msgid "alias of :class:`%s`"
msgstr ":class:`%s` alternatyvus vardas"
@@ -397,103 +419,103 @@ msgstr "(<<original entry>> galima rasti %s, eilutėje %d.)"
msgid "original entry"
msgstr "originalus įrašas"
-#: sphinx/ext/viewcode.py:66
+#: sphinx/ext/viewcode.py:70
msgid "[source]"
msgstr "[šaltinis]"
-#: sphinx/ext/viewcode.py:109
+#: sphinx/ext/viewcode.py:117
msgid "[docs]"
msgstr "[dokumentai]"
-#: sphinx/ext/viewcode.py:123
+#: sphinx/ext/viewcode.py:131
msgid "Module code"
msgstr "Modulio kodas"
-#: sphinx/ext/viewcode.py:129
+#: sphinx/ext/viewcode.py:137
#, python-format
msgid "<h1>Source code for %s</h1>"
msgstr "<h1>Kodas %s</h1>"
-#: sphinx/ext/viewcode.py:156
+#: sphinx/ext/viewcode.py:164
msgid "Overview: module code"
msgstr "Apžvalga: modulio kodas"
-#: sphinx/ext/viewcode.py:157
+#: sphinx/ext/viewcode.py:165
msgid "<h1>All modules for which code is available</h1>"
msgstr "<h1>Visi moduliai turintys kodą</h1>"
-#: sphinx/locale/__init__.py:139
+#: sphinx/locale/__init__.py:155
msgid "Attention"
msgstr "Dėmesio"
-#: sphinx/locale/__init__.py:140
+#: sphinx/locale/__init__.py:156
msgid "Caution"
msgstr "Atsargiai"
-#: sphinx/locale/__init__.py:141
+#: sphinx/locale/__init__.py:157
msgid "Danger"
msgstr "Pavojinga"
-#: sphinx/locale/__init__.py:142
+#: sphinx/locale/__init__.py:158
msgid "Error"
msgstr "Klaida"
-#: sphinx/locale/__init__.py:143
+#: sphinx/locale/__init__.py:159
msgid "Hint"
msgstr "Patarimas"
-#: sphinx/locale/__init__.py:144
+#: sphinx/locale/__init__.py:160
msgid "Important"
msgstr "Svarbu"
-#: sphinx/locale/__init__.py:145
+#: sphinx/locale/__init__.py:161
msgid "Note"
msgstr "Pastaba"
-#: sphinx/locale/__init__.py:146
+#: sphinx/locale/__init__.py:162
msgid "See Also"
msgstr "Taip pat žiūrėkite"
-#: sphinx/locale/__init__.py:147
+#: sphinx/locale/__init__.py:163
msgid "Tip"
msgstr "Patarimas"
-#: sphinx/locale/__init__.py:148
+#: sphinx/locale/__init__.py:164
msgid "Warning"
msgstr "Įspėjimas"
-#: sphinx/locale/__init__.py:152
+#: sphinx/locale/__init__.py:168
#, python-format
msgid "New in version %s"
msgstr "Nauja %s versijoje"
-#: sphinx/locale/__init__.py:153
+#: sphinx/locale/__init__.py:169
#, python-format
msgid "Changed in version %s"
msgstr "Pakeista %s versijoje"
-#: sphinx/locale/__init__.py:154
+#: sphinx/locale/__init__.py:170
#, python-format
msgid "Deprecated since version %s"
msgstr "Nebepalaikoma nuo %s versijos"
-#: sphinx/locale/__init__.py:159
+#: sphinx/locale/__init__.py:176
msgid "keyword"
msgstr "bazinis žodis"
-#: sphinx/locale/__init__.py:160
+#: sphinx/locale/__init__.py:177
msgid "operator"
msgstr "operatorius"
-#: sphinx/locale/__init__.py:161
+#: sphinx/locale/__init__.py:178
msgid "object"
msgstr "objektas"
-#: sphinx/locale/__init__.py:163
+#: sphinx/locale/__init__.py:180
msgid "statement"
msgstr "sakinis"
-#: sphinx/locale/__init__.py:164
+#: sphinx/locale/__init__.py:181
msgid "built-in function"
msgstr "įtaisytoji funkcija"
@@ -502,8 +524,8 @@ msgstr "įtaisytoji funkcija"
msgid "Table Of Contents"
msgstr "Turinys"
-#: sphinx/themes/agogo/layout.html:49 sphinx/themes/basic/layout.html:128
-#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:14
+#: sphinx/themes/agogo/layout.html:49 sphinx/themes/basic/layout.html:137
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:20
msgid "Search"
msgstr "Paieška"
@@ -551,15 +573,15 @@ msgstr "greitas visų modulių pasiekimas"
msgid "all functions, classes, terms"
msgstr "visos funkcijos, klasės ir terminai"
-#: sphinx/themes/basic/genindex-single.html:14
+#: sphinx/themes/basic/genindex-single.html:35
#, python-format
msgid "Index &ndash; %(key)s"
msgstr "Indeksas &ndash; %(key)s"
-#: sphinx/themes/basic/genindex-single.html:46
+#: sphinx/themes/basic/genindex-single.html:63
#: sphinx/themes/basic/genindex-split.html:24
#: sphinx/themes/basic/genindex-split.html:38
-#: sphinx/themes/basic/genindex.html:56
+#: sphinx/themes/basic/genindex.html:74
msgid "Full index on one page"
msgstr "Pilnas indeksas viename puslapyje"
@@ -571,39 +593,39 @@ msgstr "Indekso puslapiai pagal raidę"
msgid "can be huge"
msgstr "gali būti didelis"
-#: sphinx/themes/basic/layout.html:23
+#: sphinx/themes/basic/layout.html:29
msgid "Navigation"
msgstr "Navigacija"
-#: sphinx/themes/basic/layout.html:113
+#: sphinx/themes/basic/layout.html:122
#, python-format
msgid "Search within %(docstitle)s"
msgstr "Ieškoti tarp %(docstitle)s"
-#: sphinx/themes/basic/layout.html:122
+#: sphinx/themes/basic/layout.html:131
msgid "About these documents"
msgstr "Apie šiuos dokumentus"
-#: sphinx/themes/basic/layout.html:131
+#: sphinx/themes/basic/layout.html:140
msgid "Copyright"
msgstr "Autoriaus teisės"
-#: sphinx/themes/basic/layout.html:180
+#: sphinx/themes/basic/layout.html:189
#, python-format
msgid "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
msgstr "&copy; <a href=\"%(path)s\">Autoriaus teisės</a> %(copyright)s."
-#: sphinx/themes/basic/layout.html:182
+#: sphinx/themes/basic/layout.html:191
#, python-format
msgid "&copy; Copyright %(copyright)s."
msgstr "&copy; Autoriaus teisės %(copyright)s."
-#: sphinx/themes/basic/layout.html:186
+#: sphinx/themes/basic/layout.html:195
#, python-format
msgid "Last updated on %(last_updated)s."
msgstr "Paskutinis atnaujinimas %(last_updated)s."
-#: sphinx/themes/basic/layout.html:189
+#: sphinx/themes/basic/layout.html:198
#, python-format
msgid ""
"Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
@@ -633,7 +655,7 @@ msgstr "Kita tema"
msgid "next chapter"
msgstr "kita dalis"
-#: sphinx/themes/basic/search.html:18
+#: sphinx/themes/basic/search.html:24
msgid ""
"Please activate JavaScript to enable the search\n"
" functionality."
@@ -641,25 +663,28 @@ msgstr ""
"Prašome aktyvuoti JavaScript, kad veiktų paieškos\n"
" funkcionalumas."
-#: sphinx/themes/basic/search.html:23
+#: sphinx/themes/basic/search.html:29
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 ""
-"Čia jūs galite ieškoti šiuose dokumentuose. Įveskite savo paieškos\n žodžius į lauką apačioje ir paspauskite \"ieškoti\". Pastebėsime, kad paieškos\n funkcija automatiškai ieškos visų žodžių. Puslapiai,\n kuriuose yra mažiau žodžių nepasirodys tarp paieškos rezultatų."
+"Čia jūs galite ieškoti šiuose dokumentuose. Įveskite savo paieškos\n"
+" žodžius į lauką apačioje ir paspauskite \"ieškoti\". Pastebėsime, kad"
+" paieškos\n"
+" funkcija automatiškai ieškos visų žodžių. Puslapiai,\n"
+" kuriuose yra mažiau žodžių nepasirodys tarp paieškos rezultatų."
-#: sphinx/themes/basic/search.html:30
+#: sphinx/themes/basic/search.html:36
msgid "search"
msgstr "ieškoti"
-#: sphinx/themes/basic/search.html:34
-#: sphinx/themes/basic/static/searchtools.js:489
+#: sphinx/themes/basic/search.html:40
msgid "Search Results"
msgstr "Paieškos rezultatai"
-#: sphinx/themes/basic/search.html:36
+#: sphinx/themes/basic/search.html:42
msgid "Your search did not match any results."
msgstr "Jūsų paieška neatitiko jokių rezultatų"
@@ -699,12 +724,12 @@ msgstr "C API pakeitimai"
msgid "Other changes"
msgstr "Kiti pakeitimai"
-#: sphinx/themes/basic/static/doctools.js:154 sphinx/writers/html.py:482
-#: sphinx/writers/html.py:487
+#: sphinx/themes/basic/static/doctools.js:154 sphinx/writers/html.py:504
+#: sphinx/writers/html.py:510
msgid "Permalink to this headline"
msgstr "Nuoroda į šią antraštę"
-#: sphinx/themes/basic/static/doctools.js:160 sphinx/writers/html.py:87
+#: sphinx/themes/basic/static/doctools.js:160 sphinx/writers/html.py:92
msgid "Permalink to this definition"
msgstr "Nuoroda į šį apibrėžimą"
@@ -712,35 +737,12 @@ msgstr "Nuoroda į šį apibrėžimą"
msgid "Hide Search Matches"
msgstr "Paslėpti paieškos rezultatus"
-#: sphinx/themes/basic/static/searchtools.js:285
-msgid "Searching"
-msgstr "Ieškoma"
-
-#: sphinx/themes/basic/static/searchtools.js:290
-msgid "Preparing search..."
-msgstr "Ruošiama paieška..."
-
-#: sphinx/themes/basic/static/searchtools.js:364
-msgid ", in "
-msgstr ", kuris yra "
-
-#: sphinx/themes/basic/static/searchtools.js:491
-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 "Jūsų paieška neatitiko jokių dokumentų. Prašom patikrinti ar visi žodžiai teisingai įvesti ir ar pasirinkote pakankamai kategorijų."
-
-#: sphinx/themes/basic/static/searchtools.js:493
-#, python-format
-msgid "Search finished, found %s page(s) matching the search query."
-msgstr "Paieška baigta, paieškos rezultatus atitiko %s puslapis(-iai,-ių)"
-
-#: sphinx/themes/default/static/sidebar.js:66
+#: sphinx/themes/default/static/sidebar.js:69
msgid "Expand sidebar"
msgstr "Išplėsti šoninę juostą"
-#: sphinx/themes/default/static/sidebar.js:79
-#: sphinx/themes/default/static/sidebar.js:106
+#: sphinx/themes/default/static/sidebar.js:82
+#: sphinx/themes/default/static/sidebar.js:110
msgid "Collapse sidebar"
msgstr "Paslėpti šoninę juostą"
@@ -748,23 +750,24 @@ msgstr "Paslėpti šoninę juostą"
msgid "Contents"
msgstr "Turinys"
-#: sphinx/writers/latex.py:171
+#: sphinx/writers/latex.py:177
msgid "Release"
msgstr "Leidimas"
-#: sphinx/writers/latex.py:572 sphinx/writers/manpage.py:178
+#: sphinx/writers/latex.py:594 sphinx/writers/manpage.py:182
+#: sphinx/writers/texinfo.py:589
msgid "Footnotes"
msgstr "Išnašos"
-#: sphinx/writers/latex.py:641
+#: sphinx/writers/latex.py:676
msgid "continued from previous page"
msgstr "tęsinys iš praeito puslapio"
-#: sphinx/writers/latex.py:646
+#: sphinx/writers/latex.py:681
msgid "Continued on next page"
msgstr "Tęsinys kitame puslapyje"
-#: sphinx/writers/text.py:422
+#: sphinx/writers/text.py:437
msgid "[image]"
msgstr "[paveiksliukas]"
diff --git a/sphinx/locale/lv/LC_MESSAGES/sphinx.js b/sphinx/locale/lv/LC_MESSAGES/sphinx.js
new file mode 100644
index 00000000..7809a810
--- /dev/null
+++ b/sphinx/locale/lv/LC_MESSAGES/sphinx.js
@@ -0,0 +1 @@
+Documentation.addTranslations({"locale": "lv", "plural_expr": "(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2)", "messages": {"Hide Search Matches": "Pasl\u0113pt atlases v\u0101rdus", "Permalink to this definition": "Past\u0101v\u012bga nor\u0101de uz \u0161o defin\u012bciju", "Expand sidebar": "Izplest s\u0101njoslu", "Permalink to this headline": "Past\u0101v\u012bga nor\u0101de \u0161o virsrakstu", "Collapse sidebar": "Sav\u0113rst s\u0101njoslu"}}); \ No newline at end of file
diff --git a/sphinx/locale/lv/LC_MESSAGES/sphinx.mo b/sphinx/locale/lv/LC_MESSAGES/sphinx.mo
new file mode 100644
index 00000000..e6e713a5
--- /dev/null
+++ b/sphinx/locale/lv/LC_MESSAGES/sphinx.mo
Binary files differ
diff --git a/sphinx/locale/lv/LC_MESSAGES/sphinx.po b/sphinx/locale/lv/LC_MESSAGES/sphinx.po
new file mode 100644
index 00000000..ec19bbee
--- /dev/null
+++ b/sphinx/locale/lv/LC_MESSAGES/sphinx.po
@@ -0,0 +1,771 @@
+# Latvian translations for Sphinx.
+# This file is distributed under the same license as the Sphinx project.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx 1.0.7\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2011-09-21 10:06+0200\n"
+"PO-Revision-Date: 2011-05-10 16:40+0200\n"
+"Last-Translator: alexander smishlajev <alex@gorka.lv>\n"
+"Language-Team: lv <LL@li.org>\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"(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.6\n"
+
+#: sphinx/config.py:81
+#, python-format
+msgid "%s %s documentation"
+msgstr ""
+
+#: sphinx/environment.py:119 sphinx/writers/latex.py:190
+#: sphinx/writers/manpage.py:67 sphinx/writers/texinfo.py:203
+#, python-format
+msgid "%B %d, %Y"
+msgstr "%d.%m.%Y"
+
+#: sphinx/environment.py:1625
+#, python-format
+msgid "see %s"
+msgstr ""
+
+#: sphinx/environment.py:1628
+#, python-format
+msgid "see also %s"
+msgstr ""
+
+#: sphinx/roles.py:175
+#, python-format
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr ""
+
+#: sphinx/builders/changes.py:73
+msgid "Builtins"
+msgstr "Iebūvētie"
+
+#: sphinx/builders/changes.py:75
+msgid "Module level"
+msgstr "Moduļu līmenis"
+
+#: sphinx/builders/html.py:274
+#, python-format
+msgid "%b %d, %Y"
+msgstr "%d.%m.%Y"
+
+#: sphinx/builders/html.py:293 sphinx/themes/basic/defindex.html:30
+msgid "General Index"
+msgstr "Vispārējs indekss"
+
+#: sphinx/builders/html.py:293
+msgid "index"
+msgstr "indekss"
+
+#: sphinx/builders/html.py:353
+msgid "next"
+msgstr "nākošais"
+
+#: sphinx/builders/html.py:362
+msgid "previous"
+msgstr "iepriekšējs"
+
+#: sphinx/builders/latex.py:141 sphinx/builders/texinfo.py:196
+msgid " (in "
+msgstr " (iekš "
+
+#: sphinx/directives/other.py:136
+msgid "Section author: "
+msgstr "Sekcijas autors: "
+
+#: sphinx/directives/other.py:138
+msgid "Module author: "
+msgstr "Moduļa autors: "
+
+#: sphinx/directives/other.py:140
+msgid "Code author: "
+msgstr "Koda autors: "
+
+#: sphinx/directives/other.py:142
+msgid "Author: "
+msgstr "Autors: "
+
+#: sphinx/directives/other.py:215
+msgid "See also"
+msgstr "Skat.arī"
+
+#: sphinx/domains/__init__.py:244
+#, python-format
+msgid "%s %s"
+msgstr "%s %s"
+
+#: sphinx/domains/c.py:51 sphinx/domains/python.py:95
+msgid "Parameters"
+msgstr "Parametri"
+
+#: sphinx/domains/c.py:54 sphinx/domains/javascript.py:128
+#: sphinx/domains/python.py:107
+msgid "Returns"
+msgstr "Atgriež"
+
+#: sphinx/domains/c.py:56 sphinx/domains/python.py:109
+msgid "Return type"
+msgstr "Atgriežamais tips"
+
+#: sphinx/domains/c.py:141
+#, python-format
+msgid "%s (C function)"
+msgstr "%s (C funkcija)"
+
+#: sphinx/domains/c.py:143
+#, python-format
+msgid "%s (C member)"
+msgstr "%s (C loceklis)"
+
+#: sphinx/domains/c.py:145
+#, python-format
+msgid "%s (C macro)"
+msgstr "%s (C makross)"
+
+#: sphinx/domains/c.py:147
+#, python-format
+msgid "%s (C type)"
+msgstr "%s (C tips)"
+
+#: sphinx/domains/c.py:149
+#, python-format
+msgid "%s (C variable)"
+msgstr "%s (C mainīgais)"
+
+#: sphinx/domains/c.py:204 sphinx/domains/cpp.py:1060
+#: sphinx/domains/javascript.py:162 sphinx/domains/python.py:559
+msgid "function"
+msgstr "funkcija"
+
+#: sphinx/domains/c.py:205 sphinx/domains/cpp.py:1061
+msgid "member"
+msgstr "loceklis"
+
+#: sphinx/domains/c.py:206
+msgid "macro"
+msgstr "makross"
+
+#: sphinx/domains/c.py:207 sphinx/domains/cpp.py:1062
+msgid "type"
+msgstr "tips"
+
+#: sphinx/domains/c.py:208
+msgid "variable"
+msgstr "mainīgais"
+
+#: sphinx/domains/cpp.py:904
+#, python-format
+msgid "%s (C++ class)"
+msgstr "%s (C++ klase)"
+
+#: sphinx/domains/cpp.py:919
+#, python-format
+msgid "%s (C++ type)"
+msgstr "%s (C++ tips)"
+
+#: sphinx/domains/cpp.py:938
+#, python-format
+msgid "%s (C++ member)"
+msgstr "%s (C++ loceklis)"
+
+#: sphinx/domains/cpp.py:990
+#, python-format
+msgid "%s (C++ function)"
+msgstr "%s (C++ funkcija)"
+
+#: sphinx/domains/cpp.py:1059 sphinx/domains/javascript.py:163
+#: sphinx/domains/python.py:561
+msgid "class"
+msgstr "klase"
+
+#: sphinx/domains/javascript.py:106 sphinx/domains/python.py:254
+#, python-format
+msgid "%s() (built-in function)"
+msgstr "%s() (iebūvēta funkcija)"
+
+#: sphinx/domains/javascript.py:107 sphinx/domains/python.py:318
+#, python-format
+msgid "%s() (%s method)"
+msgstr "%s() (%s metods)"
+
+#: sphinx/domains/javascript.py:109
+#, fuzzy, python-format
+msgid "%s() (class)"
+msgstr "%s (C++ klase)"
+
+#: sphinx/domains/javascript.py:111
+#, python-format
+msgid "%s (global variable or constant)"
+msgstr "%s (globālais mainīgais vai konstanta)"
+
+#: sphinx/domains/javascript.py:113 sphinx/domains/python.py:356
+#, python-format
+msgid "%s (%s attribute)"
+msgstr "%s (%s atributs)"
+
+#: sphinx/domains/javascript.py:122
+msgid "Arguments"
+msgstr "Argumenti"
+
+#: sphinx/domains/javascript.py:125
+msgid "Throws"
+msgstr "Izmet"
+
+#: sphinx/domains/javascript.py:164 sphinx/domains/python.py:560
+msgid "data"
+msgstr "dati"
+
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:566
+msgid "attribute"
+msgstr "atributs"
+
+#: sphinx/domains/python.py:100
+msgid "Variables"
+msgstr "Mainīgie"
+
+#: sphinx/domains/python.py:104
+msgid "Raises"
+msgstr "Ceļ"
+
+#: sphinx/domains/python.py:255 sphinx/domains/python.py:312
+#: sphinx/domains/python.py:324 sphinx/domains/python.py:337
+#, python-format
+msgid "%s() (in module %s)"
+msgstr "%s() (moduļī %s)"
+
+#: sphinx/domains/python.py:258
+#, python-format
+msgid "%s (built-in variable)"
+msgstr "%s (iebūvētais mainīgais)"
+
+#: sphinx/domains/python.py:259 sphinx/domains/python.py:350
+#, python-format
+msgid "%s (in module %s)"
+msgstr "%s (moduļī %s)"
+
+#: sphinx/domains/python.py:275
+#, python-format
+msgid "%s (built-in class)"
+msgstr "%s (iebūvēta klase)"
+
+#: sphinx/domains/python.py:276
+#, python-format
+msgid "%s (class in %s)"
+msgstr "%s (klase iekš %s)"
+
+#: sphinx/domains/python.py:316
+#, python-format
+msgid "%s() (%s.%s method)"
+msgstr "%s() (%s.%s metods)"
+
+#: sphinx/domains/python.py:328
+#, python-format
+msgid "%s() (%s.%s static method)"
+msgstr "%s() (%s.%s statiskais metods)"
+
+#: sphinx/domains/python.py:331
+#, python-format
+msgid "%s() (%s static method)"
+msgstr "%s() (%s statiskais metods)"
+
+#: sphinx/domains/python.py:341
+#, python-format
+msgid "%s() (%s.%s class method)"
+msgstr "%s() (%s.%s klases metods)"
+
+#: sphinx/domains/python.py:344
+#, python-format
+msgid "%s() (%s class method)"
+msgstr "%s() (%s klases metods)"
+
+#: sphinx/domains/python.py:354
+#, python-format
+msgid "%s (%s.%s attribute)"
+msgstr "%s (%s.%s atributs)"
+
+#: sphinx/domains/python.py:434
+#, python-format
+msgid "%s (module)"
+msgstr "%s (modulis)"
+
+#: sphinx/domains/python.py:491
+msgid "Python Module Index"
+msgstr ""
+
+#: sphinx/domains/python.py:492
+msgid "modules"
+msgstr "moduļi"
+
+#: sphinx/domains/python.py:537
+msgid "Deprecated"
+msgstr "Nav ieteicams"
+
+#: sphinx/domains/python.py:562 sphinx/locale/__init__.py:179
+msgid "exception"
+msgstr "izņēmums"
+
+#: sphinx/domains/python.py:563
+msgid "method"
+msgstr "metods"
+
+#: sphinx/domains/python.py:564
+msgid "class method"
+msgstr "klases metods"
+
+#: sphinx/domains/python.py:565
+msgid "static method"
+msgstr "statiskais metods"
+
+#: sphinx/domains/python.py:567 sphinx/locale/__init__.py:175
+msgid "module"
+msgstr "modulis"
+
+#: sphinx/domains/python.py:695
+#, fuzzy
+msgid " (deprecated)"
+msgstr "Nav ieteicams"
+
+#: sphinx/domains/rst.py:55
+#, python-format
+msgid "%s (directive)"
+msgstr "%s (direktīva)"
+
+#: sphinx/domains/rst.py:57
+#, python-format
+msgid "%s (role)"
+msgstr "%s (role)"
+
+#: sphinx/domains/rst.py:106
+msgid "directive"
+msgstr "direktīva"
+
+#: sphinx/domains/rst.py:107
+msgid "role"
+msgstr "role"
+
+#: sphinx/domains/std.py:70 sphinx/domains/std.py:86
+#, python-format
+msgid "environment variable; %s"
+msgstr "apkārtnes mainīgais; %s"
+
+#: sphinx/domains/std.py:162
+#, python-format
+msgid "%scommand line option; %s"
+msgstr "%skomandrindas opcija; %s"
+
+#: sphinx/domains/std.py:393
+msgid "glossary term"
+msgstr "glosārija termins"
+
+#: sphinx/domains/std.py:394
+msgid "grammar token"
+msgstr "gramatiskais marķieris"
+
+#: sphinx/domains/std.py:395
+msgid "reference label"
+msgstr "atsauces virsraksts"
+
+#: sphinx/domains/std.py:396
+msgid "environment variable"
+msgstr "apkārtnes mainīgais"
+
+#: sphinx/domains/std.py:397
+msgid "program option"
+msgstr "programmas opcija"
+
+#: sphinx/domains/std.py:427 sphinx/themes/basic/genindex-single.html:32
+#: sphinx/themes/basic/genindex-split.html:11
+#: sphinx/themes/basic/genindex-split.html:14
+#: sphinx/themes/basic/genindex.html:32 sphinx/themes/basic/genindex.html:35
+#: sphinx/themes/basic/genindex.html:68 sphinx/themes/basic/layout.html:134
+#: sphinx/writers/latex.py:179 sphinx/writers/texinfo.py:456
+msgid "Index"
+msgstr "Indekss"
+
+#: sphinx/domains/std.py:428
+msgid "Module Index"
+msgstr "Moduļu indekss"
+
+#: sphinx/domains/std.py:429 sphinx/themes/basic/defindex.html:25
+msgid "Search Page"
+msgstr "Atlases lapa"
+
+#: sphinx/ext/autodoc.py:1002
+#, python-format
+msgid " Bases: %s"
+msgstr " Bāzes: %s"
+
+#: sphinx/ext/autodoc.py:1038
+#, python-format
+msgid "alias of :class:`%s`"
+msgstr "aizstājvārds klasei :class:`%s`"
+
+#: sphinx/ext/todo.py:41
+msgid "Todo"
+msgstr "Jāizdara"
+
+#: sphinx/ext/todo.py:109
+#, python-format
+msgid "(The <<original entry>> is located in %s, line %d.)"
+msgstr "(<<original entry>> atrodas iekš %s, rinda %d.)"
+
+#: sphinx/ext/todo.py:117
+msgid "original entry"
+msgstr "sākotnējs ieraksts"
+
+#: sphinx/ext/viewcode.py:70
+msgid "[source]"
+msgstr "[kods]"
+
+#: sphinx/ext/viewcode.py:117
+msgid "[docs]"
+msgstr "[dokumenti]"
+
+#: sphinx/ext/viewcode.py:131
+msgid "Module code"
+msgstr "Moduļa teksts"
+
+#: sphinx/ext/viewcode.py:137
+#, python-format
+msgid "<h1>Source code for %s</h1>"
+msgstr "<h1>%s izejas teksts</h1>"
+
+#: sphinx/ext/viewcode.py:164
+msgid "Overview: module code"
+msgstr "Apskats: moduļa teksts"
+
+#: sphinx/ext/viewcode.py:165
+msgid "<h1>All modules for which code is available</h1>"
+msgstr "<h1>Visi moduļi, kuriem ir izejas teksti</h1>"
+
+#: sphinx/locale/__init__.py:155
+msgid "Attention"
+msgstr "Uzmanību"
+
+#: sphinx/locale/__init__.py:156
+msgid "Caution"
+msgstr "Uzmanies"
+
+#: sphinx/locale/__init__.py:157
+msgid "Danger"
+msgstr "Bīstami"
+
+#: sphinx/locale/__init__.py:158
+msgid "Error"
+msgstr "Kļūda"
+
+#: sphinx/locale/__init__.py:159
+msgid "Hint"
+msgstr "Mājiens"
+
+#: sphinx/locale/__init__.py:160
+msgid "Important"
+msgstr "Svarīgi"
+
+#: sphinx/locale/__init__.py:161
+msgid "Note"
+msgstr "Piezīme"
+
+#: sphinx/locale/__init__.py:162
+msgid "See Also"
+msgstr "Skat.arī"
+
+#: sphinx/locale/__init__.py:163
+msgid "Tip"
+msgstr "Padoms"
+
+#: sphinx/locale/__init__.py:164
+msgid "Warning"
+msgstr "Brīdinājums"
+
+#: sphinx/locale/__init__.py:168
+#, python-format
+msgid "New in version %s"
+msgstr "Jauns versijā %s"
+
+#: sphinx/locale/__init__.py:169
+#, python-format
+msgid "Changed in version %s"
+msgstr "Mainīts versijā %s"
+
+#: sphinx/locale/__init__.py:170
+#, python-format
+msgid "Deprecated since version %s"
+msgstr "Neieteicams no versijas %s"
+
+#: sphinx/locale/__init__.py:176
+msgid "keyword"
+msgstr "atslēgas vārds"
+
+#: sphinx/locale/__init__.py:177
+msgid "operator"
+msgstr "operators"
+
+#: sphinx/locale/__init__.py:178
+msgid "object"
+msgstr "objekts"
+
+#: sphinx/locale/__init__.py:180
+msgid "statement"
+msgstr "priekšraksts"
+
+#: sphinx/locale/__init__.py:181
+msgid "built-in function"
+msgstr "iebūvēta funkcija"
+
+#: sphinx/themes/agogo/layout.html:45 sphinx/themes/basic/globaltoc.html:10
+#: sphinx/themes/basic/localtoc.html:11
+msgid "Table Of Contents"
+msgstr "Saturs"
+
+#: sphinx/themes/agogo/layout.html:49 sphinx/themes/basic/layout.html:137
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:20
+msgid "Search"
+msgstr "Meklēt"
+
+#: sphinx/themes/agogo/layout.html:52 sphinx/themes/basic/searchbox.html:15
+msgid "Go"
+msgstr "Izpildīt"
+
+#: sphinx/themes/agogo/layout.html:57 sphinx/themes/basic/searchbox.html:20
+msgid "Enter search terms or a module, class or function name."
+msgstr "Ievadiet meklējamus terminus vai moduļa, klases vai funkcijas vārdu."
+
+#: sphinx/themes/agogo/layout.html:78 sphinx/themes/basic/sourcelink.html:14
+msgid "Show Source"
+msgstr "Rādīt izejas tekstu"
+
+#: sphinx/themes/basic/defindex.html:11
+msgid "Overview"
+msgstr "Apskats"
+
+#: sphinx/themes/basic/defindex.html:20
+msgid "Indices and tables:"
+msgstr "Indeksi un tabulas:"
+
+#: sphinx/themes/basic/defindex.html:23
+msgid "Complete Table of Contents"
+msgstr "Pilns saturs"
+
+#: sphinx/themes/basic/defindex.html:24
+msgid "lists all sections and subsections"
+msgstr "rāda visas sekcijas un apakšsekcijas"
+
+#: sphinx/themes/basic/defindex.html:26
+msgid "search this documentation"
+msgstr "meklēt šajā dokumentācijā"
+
+#: sphinx/themes/basic/defindex.html:28
+msgid "Global Module Index"
+msgstr "Vispārējs moduļu indekss"
+
+#: sphinx/themes/basic/defindex.html:29
+msgid "quick access to all modules"
+msgstr "ātra piekļuve visiem moduliem"
+
+#: sphinx/themes/basic/defindex.html:31
+msgid "all functions, classes, terms"
+msgstr "visas funkcijas, klases un termini"
+
+#: sphinx/themes/basic/genindex-single.html:35
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr "Indekss &ndash; %(key)s"
+
+#: sphinx/themes/basic/genindex-single.html:63
+#: sphinx/themes/basic/genindex-split.html:24
+#: sphinx/themes/basic/genindex-split.html:38
+#: sphinx/themes/basic/genindex.html:74
+msgid "Full index on one page"
+msgstr "Pilns indekss vienā lappusē"
+
+#: sphinx/themes/basic/genindex-split.html:16
+msgid "Index pages by letter"
+msgstr "Lappušu indekss pēc burtiem"
+
+#: sphinx/themes/basic/genindex-split.html:25
+msgid "can be huge"
+msgstr "var būt milzīgs"
+
+#: sphinx/themes/basic/layout.html:29
+msgid "Navigation"
+msgstr "Navigācija"
+
+#: sphinx/themes/basic/layout.html:122
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr "Meklēt iekš %(docstitle)s"
+
+#: sphinx/themes/basic/layout.html:131
+msgid "About these documents"
+msgstr "Par šiem dokumentiem"
+
+#: sphinx/themes/basic/layout.html:140
+msgid "Copyright"
+msgstr "Copyright"
+
+#: sphinx/themes/basic/layout.html:189
+#, python-format
+msgid "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
+msgstr "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
+
+#: sphinx/themes/basic/layout.html:191
+#, python-format
+msgid "&copy; Copyright %(copyright)s."
+msgstr "&copy; Copyright %(copyright)s."
+
+#: sphinx/themes/basic/layout.html:195
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr "Pēdējas izmaiņas %(last_updated)s."
+
+#: sphinx/themes/basic/layout.html:198
+#, python-format
+msgid ""
+"Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+"Sagatavots izmantojot <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+
+#: sphinx/themes/basic/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr "%(docstitle)s meklēšana"
+
+#: sphinx/themes/basic/relations.html:11
+msgid "Previous topic"
+msgstr "iepriekšēja tēma"
+
+#: sphinx/themes/basic/relations.html:13
+msgid "previous chapter"
+msgstr "iepriekšēja sadaļa"
+
+#: sphinx/themes/basic/relations.html:16
+msgid "Next topic"
+msgstr "nākoša tēma"
+
+#: sphinx/themes/basic/relations.html:18
+msgid "next chapter"
+msgstr "nākoša sadaļa"
+
+#: sphinx/themes/basic/search.html:24
+msgid ""
+"Please activate JavaScript to enable the search\n"
+" functionality."
+msgstr "Lai iespējotu meklēšanu, lūdzu aktivizēt JavaScript."
+
+#: sphinx/themes/basic/search.html:29
+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 ""
+"Šeit Jūs varat meklēt šajos dokumentos. Norādiet meklējamus vārdus\n"
+" ievada lauka un uzklikšķiniet pogu \"meklēt\". Lūdzu ievērojiet,\n"
+" ka meklēšanas programma atradīs tikai tos dokumentus, kuros ir\n"
+" visi ievadītie vārdi. Dokumenti, kuros ir tikai daļa no ievadītiem\n"
+" vārdiem, netiks atlasīti."
+
+#: sphinx/themes/basic/search.html:36
+msgid "search"
+msgstr "meklēt"
+
+#: sphinx/themes/basic/search.html:40
+msgid "Search Results"
+msgstr "Atlases rezultāti"
+
+#: sphinx/themes/basic/search.html:42
+msgid "Your search did not match any results."
+msgstr "Nav rezultātu, atbilstošu Jūsu atlasei."
+
+#: sphinx/themes/basic/searchbox.html:12
+msgid "Quick search"
+msgstr "Ātra meklēšana"
+
+#: sphinx/themes/basic/sourcelink.html:11
+msgid "This Page"
+msgstr "Šī lappuse"
+
+#: sphinx/themes/basic/changes/frameset.html:5
+#: sphinx/themes/basic/changes/versionchanges.html:12
+#, python-format
+msgid "Changes in Version %(version)s &mdash; %(docstitle)s"
+msgstr "Izmaiņas versijā %(version)s &mdash; %(docstitle)s"
+
+#: sphinx/themes/basic/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &mdash; %(docstitle)s"
+msgstr "%(filename)s &mdash; %(docstitle)s"
+
+#: sphinx/themes/basic/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr "Automātiski sagatavots izmaiņu saraksts versijai %(version)s"
+
+#: sphinx/themes/basic/changes/versionchanges.html:18
+msgid "Library changes"
+msgstr "Bibliotēkas izmaiņas"
+
+#: sphinx/themes/basic/changes/versionchanges.html:23
+msgid "C API changes"
+msgstr "Izmaiņas iekš C API"
+
+#: sphinx/themes/basic/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr "Citas izmaiņas"
+
+#: sphinx/themes/basic/static/doctools.js:154 sphinx/writers/html.py:504
+#: sphinx/writers/html.py:510
+msgid "Permalink to this headline"
+msgstr "Pastāvīga norāde šo virsrakstu"
+
+#: sphinx/themes/basic/static/doctools.js:160 sphinx/writers/html.py:92
+msgid "Permalink to this definition"
+msgstr "Pastāvīga norāde uz šo definīciju"
+
+#: sphinx/themes/basic/static/doctools.js:189
+msgid "Hide Search Matches"
+msgstr "Paslēpt atlases vārdus"
+
+#: sphinx/themes/default/static/sidebar.js:69
+msgid "Expand sidebar"
+msgstr "Izplest sānjoslu"
+
+#: sphinx/themes/default/static/sidebar.js:82
+#: sphinx/themes/default/static/sidebar.js:110
+msgid "Collapse sidebar"
+msgstr "Savērst sānjoslu"
+
+#: sphinx/themes/haiku/layout.html:26
+msgid "Contents"
+msgstr "Saturs"
+
+#: sphinx/writers/latex.py:177
+msgid "Release"
+msgstr "Izlaidums"
+
+#: sphinx/writers/latex.py:594 sphinx/writers/manpage.py:182
+#: sphinx/writers/texinfo.py:589
+msgid "Footnotes"
+msgstr "Vēres"
+
+#: sphinx/writers/latex.py:676
+msgid "continued from previous page"
+msgstr "turpinājums no iepriekšējās lappuses"
+
+#: sphinx/writers/latex.py:681
+msgid "Continued on next page"
+msgstr "Turpnājums nākošā lappusē"
+
+#: sphinx/writers/text.py:437
+msgid "[image]"
+msgstr "[attēls]"
+
diff --git a/sphinx/locale/ne/LC_MESSAGES/sphinx.js b/sphinx/locale/ne/LC_MESSAGES/sphinx.js
new file mode 100644
index 00000000..d45d217e
--- /dev/null
+++ b/sphinx/locale/ne/LC_MESSAGES/sphinx.js
@@ -0,0 +1 @@
+Documentation.addTranslations({"locale": "ne", "plural_expr": "(n != 1)", "messages": {"Hide Search Matches": "\u0916\u094b\u091c\u0947\u0915\u094b \u0928\u0924\u093f\u091c\u093e\u0939\u0930\u0941 \u0932\u0941\u0915\u093e\u0909\u0928\u0941\u0939\u094b\u0938\u094d", "Permalink to this definition": "\u092f\u094b \u0905\u0930\u094d\u0925\u0915\u094b \u0932\u093e\u0917\u093f \u092a\u0930\u094d\u092e\u093e\u0932\u093f\u0928\u094d\u0915", "Expand sidebar": "\u0938\u093e\u0907\u0921\u092c\u0930 \u0920\u0941\u0932\u094b \u092c\u0928\u093e\u0909\u0928\u0941\u0939\u094b\u0938\u094d", "Permalink to this headline": "\u092f\u094b \u0936\u093f\u0930\u094d\u0937\u0915\u0915\u094b \u0932\u093e\u0917\u093f \u092a\u0930\u094d\u092e\u093e\u0932\u093f\u0928\u094d\u0915 \u0964 ", "Collapse sidebar": "\u0938\u093e\u0907\u0921\u092c\u0930 \u0938\u093e\u0928\u094b \u092c\u0928\u093e\u0909\u0928\u0941\u0939\u094b\u0938\u094d"}}); \ No newline at end of file
diff --git a/sphinx/locale/ne/LC_MESSAGES/sphinx.mo b/sphinx/locale/ne/LC_MESSAGES/sphinx.mo
new file mode 100644
index 00000000..05be753d
--- /dev/null
+++ b/sphinx/locale/ne/LC_MESSAGES/sphinx.mo
Binary files differ
diff --git a/sphinx/locale/ne/LC_MESSAGES/sphinx.po b/sphinx/locale/ne/LC_MESSAGES/sphinx.po
new file mode 100644
index 00000000..5cb11e20
--- /dev/null
+++ b/sphinx/locale/ne/LC_MESSAGES/sphinx.po
@@ -0,0 +1,768 @@
+# Nepali (Nepal) translations for Sphinx.
+# Copyright (C) 2011 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx 1.1pre/47a94f723e80+\n"
+"Report-Msgid-Bugs-To: sharma.arati11@gmail.com\n"
+"POT-Creation-Date: 2011-09-21 10:06+0200\n"
+"PO-Revision-Date: 2011-09-21 10:13+0200\n"
+"Last-Translator: Tika Karki <tikaraj.karki@olenepal.org>\n"
+"Language-Team: ne_NP <LL@li.org>\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.6\n"
+
+#: sphinx/config.py:81
+#, python-format
+msgid "%s %s documentation"
+msgstr ""
+
+#: sphinx/environment.py:119 sphinx/writers/latex.py:190
+#: sphinx/writers/manpage.py:67 sphinx/writers/texinfo.py:203
+#, python-format
+msgid "%B %d, %Y"
+msgstr "%B %d, %Y"
+
+#: sphinx/environment.py:1625
+#, python-format
+msgid "see %s"
+msgstr "%s हेर्नुहोस्"
+
+#: sphinx/environment.py:1628
+#, python-format
+msgid "see also %s"
+msgstr "%s पनि हेर्नुहोस् "
+
+#: sphinx/roles.py:175
+#, python-format
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr "Python Enhancement Proposals; PEP %s"
+
+#: sphinx/builders/changes.py:73
+msgid "Builtins"
+msgstr "बिइल्टिन्स"
+
+#: sphinx/builders/changes.py:75
+msgid "Module level"
+msgstr "मडुलको तह"
+
+#: sphinx/builders/html.py:274
+#, python-format
+msgid "%b %d, %Y"
+msgstr "%b %d, %Y"
+
+#: sphinx/builders/html.py:293 sphinx/themes/basic/defindex.html:30
+msgid "General Index"
+msgstr "सामान्य अनुसुची"
+
+#: sphinx/builders/html.py:293
+msgid "index"
+msgstr "अनुसुची"
+
+#: sphinx/builders/html.py:353
+msgid "next"
+msgstr "पछिल्लो"
+
+#: sphinx/builders/html.py:362
+msgid "previous"
+msgstr "अघिल्लो"
+
+#: sphinx/builders/latex.py:141 sphinx/builders/texinfo.py:196
+msgid " (in "
+msgstr "(in"
+
+#: sphinx/directives/other.py:136
+msgid "Section author: "
+msgstr "सेक्सनको लेखक"
+
+#: sphinx/directives/other.py:138
+msgid "Module author: "
+msgstr "मडुलको लेखक"
+
+#: sphinx/directives/other.py:140
+msgid "Code author: "
+msgstr "Codeको लेखक "
+
+#: sphinx/directives/other.py:142
+msgid "Author: "
+msgstr "लेखक"
+
+#: sphinx/directives/other.py:215
+msgid "See also"
+msgstr "पनि हेर्नुहोस"
+
+#: sphinx/domains/__init__.py:244
+#, python-format
+msgid "%s %s"
+msgstr "%s %s"
+
+#: sphinx/domains/c.py:51 sphinx/domains/python.py:95
+msgid "Parameters"
+msgstr "Parameters"
+
+#: sphinx/domains/c.py:54 sphinx/domains/javascript.py:128
+#: sphinx/domains/python.py:107
+msgid "Returns"
+msgstr "Returns"
+
+#: sphinx/domains/c.py:56 sphinx/domains/python.py:109
+msgid "Return type"
+msgstr "Return type"
+
+#: sphinx/domains/c.py:141
+#, python-format
+msgid "%s (C function)"
+msgstr "%s (C कार्य)"
+
+#: sphinx/domains/c.py:143
+#, python-format
+msgid "%s (C member)"
+msgstr "%s (C सदस्य)"
+
+#: sphinx/domains/c.py:145
+#, python-format
+msgid "%s (C macro)"
+msgstr "%s (C बृहत)"
+
+#: sphinx/domains/c.py:147
+#, python-format
+msgid "%s (C type)"
+msgstr "%s (C किसिम)"
+
+#: sphinx/domains/c.py:149
+#, python-format
+msgid "%s (C variable)"
+msgstr "%s (C चल)"
+
+#: sphinx/domains/c.py:204 sphinx/domains/cpp.py:1060
+#: sphinx/domains/javascript.py:162 sphinx/domains/python.py:559
+msgid "function"
+msgstr "फन्क्सन"
+
+#: sphinx/domains/c.py:205 sphinx/domains/cpp.py:1061
+msgid "member"
+msgstr "सदस्य"
+
+#: sphinx/domains/c.py:206
+msgid "macro"
+msgstr "बृहत"
+
+#: sphinx/domains/c.py:207 sphinx/domains/cpp.py:1062
+msgid "type"
+msgstr "किसिम"
+
+#: sphinx/domains/c.py:208
+msgid "variable"
+msgstr "चल"
+
+#: sphinx/domains/cpp.py:904
+#, python-format
+msgid "%s (C++ class)"
+msgstr "%s (C++ कक्षा)"
+
+#: sphinx/domains/cpp.py:919
+#, python-format
+msgid "%s (C++ type)"
+msgstr "%s (C++ किसिम)"
+
+#: sphinx/domains/cpp.py:938
+#, python-format
+msgid "%s (C++ member)"
+msgstr "%s (C++ सदस्य)"
+
+#: sphinx/domains/cpp.py:990
+#, python-format
+msgid "%s (C++ function)"
+msgstr "%s (C++कार्य)"
+
+#: sphinx/domains/cpp.py:1059 sphinx/domains/javascript.py:163
+#: sphinx/domains/python.py:561
+msgid "class"
+msgstr "कक्षा"
+
+#: sphinx/domains/javascript.py:106 sphinx/domains/python.py:254
+#, python-format
+msgid "%s() (built-in function)"
+msgstr "%s() (built-in function)"
+
+#: sphinx/domains/javascript.py:107 sphinx/domains/python.py:318
+#, python-format
+msgid "%s() (%s method)"
+msgstr "%s() (%s विधी)"
+
+#: sphinx/domains/javascript.py:109
+#, python-format
+msgid "%s() (class)"
+msgstr "%s() (कक्षा)"
+
+#: sphinx/domains/javascript.py:111
+#, python-format
+msgid "%s (global variable or constant)"
+msgstr "%s (global variable or constant)"
+
+#: sphinx/domains/javascript.py:113 sphinx/domains/python.py:356
+#, python-format
+msgid "%s (%s attribute)"
+msgstr "%s (%s attribute)"
+
+#: sphinx/domains/javascript.py:122
+msgid "Arguments"
+msgstr "Arguments"
+
+#: sphinx/domains/javascript.py:125
+msgid "Throws"
+msgstr "Throws"
+
+#: sphinx/domains/javascript.py:164 sphinx/domains/python.py:560
+msgid "data"
+msgstr "data"
+
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:566
+msgid "attribute"
+msgstr "attribute"
+
+#: sphinx/domains/python.py:100
+msgid "Variables"
+msgstr "चलहरू"
+
+#: sphinx/domains/python.py:104
+msgid "Raises"
+msgstr "Raises"
+
+#: sphinx/domains/python.py:255 sphinx/domains/python.py:312
+#: sphinx/domains/python.py:324 sphinx/domains/python.py:337
+#, python-format
+msgid "%s() (in module %s)"
+msgstr "%s() (in मडुल %s)"
+
+#: sphinx/domains/python.py:258
+#, python-format
+msgid "%s (built-in variable)"
+msgstr "%s (built-in चल)"
+
+#: sphinx/domains/python.py:259 sphinx/domains/python.py:350
+#, python-format
+msgid "%s (in module %s)"
+msgstr "%s (in मडुल %s)"
+
+#: sphinx/domains/python.py:275
+#, python-format
+msgid "%s (built-in class)"
+msgstr "%s (built-in कक्षा)"
+
+#: sphinx/domains/python.py:276
+#, python-format
+msgid "%s (class in %s)"
+msgstr "%s (कक्षा in %s)"
+
+#: sphinx/domains/python.py:316
+#, python-format
+msgid "%s() (%s.%s method)"
+msgstr "%s() (%s.%s विधी)"
+
+#: sphinx/domains/python.py:328
+#, python-format
+msgid "%s() (%s.%s static method)"
+msgstr "%s() (%s.%s static विधी)"
+
+#: sphinx/domains/python.py:331
+#, python-format
+msgid "%s() (%s static method)"
+msgstr "%s() (%s static विधी)"
+
+#: sphinx/domains/python.py:341
+#, python-format
+msgid "%s() (%s.%s class method)"
+msgstr "%s() (%s.%s कक्षा विधी)"
+
+#: sphinx/domains/python.py:344
+#, python-format
+msgid "%s() (%s class method)"
+msgstr "%s() (%s कक्षा विधी)"
+
+#: sphinx/domains/python.py:354
+#, python-format
+msgid "%s (%s.%s attribute)"
+msgstr "%s (%s.%s attribute)"
+
+#: sphinx/domains/python.py:434
+#, python-format
+msgid "%s (module)"
+msgstr "%s (मडुल)"
+
+#: sphinx/domains/python.py:491
+msgid "Python Module Index"
+msgstr "Python Module Index"
+
+#: sphinx/domains/python.py:492
+msgid "modules"
+msgstr "modules"
+
+#: sphinx/domains/python.py:537
+msgid "Deprecated"
+msgstr "Deprecated"
+
+#: sphinx/domains/python.py:562 sphinx/locale/__init__.py:179
+msgid "exception"
+msgstr "अपबाद"
+
+#: sphinx/domains/python.py:563
+msgid "method"
+msgstr "विधी"
+
+#: sphinx/domains/python.py:564
+msgid "class method"
+msgstr "कक्षा विधी"
+
+#: sphinx/domains/python.py:565
+msgid "static method"
+msgstr "static विधी"
+
+#: sphinx/domains/python.py:567 sphinx/locale/__init__.py:175
+msgid "module"
+msgstr "मडुल"
+
+#: sphinx/domains/python.py:695
+msgid " (deprecated)"
+msgstr "(deprecated)"
+
+#: sphinx/domains/rst.py:55
+#, python-format
+msgid "%s (directive)"
+msgstr "%s (निर्देशिक)"
+
+#: sphinx/domains/rst.py:57
+#, python-format
+msgid "%s (role)"
+msgstr "%s (भूमिका)"
+
+#: sphinx/domains/rst.py:106
+msgid "directive"
+msgstr "निर्देशिक"
+
+#: sphinx/domains/rst.py:107
+msgid "role"
+msgstr "भूमिका"
+
+#: sphinx/domains/std.py:70 sphinx/domains/std.py:86
+#, python-format
+msgid "environment variable; %s"
+msgstr "environment variable; %s"
+
+#: sphinx/domains/std.py:162
+#, python-format
+msgid "%scommand line option; %s"
+msgstr "%scommand line option; %s"
+
+#: sphinx/domains/std.py:393
+msgid "glossary term"
+msgstr "शब्द-अर्थमा भएको"
+
+#: sphinx/domains/std.py:394
+msgid "grammar token"
+msgstr "grammar token"
+
+#: sphinx/domains/std.py:395
+msgid "reference label"
+msgstr "सन्दर्व सामग्री"
+
+#: sphinx/domains/std.py:396
+msgid "environment variable"
+msgstr "environment variable"
+
+#: sphinx/domains/std.py:397
+msgid "program option"
+msgstr "कार्यक्रमका बिकल्प"
+
+#: sphinx/domains/std.py:427 sphinx/themes/basic/genindex-single.html:32
+#: sphinx/themes/basic/genindex-split.html:11
+#: sphinx/themes/basic/genindex-split.html:14
+#: sphinx/themes/basic/genindex.html:32 sphinx/themes/basic/genindex.html:35
+#: sphinx/themes/basic/genindex.html:68 sphinx/themes/basic/layout.html:134
+#: sphinx/writers/latex.py:179 sphinx/writers/texinfo.py:456
+msgid "Index"
+msgstr "अनुसुची"
+
+#: sphinx/domains/std.py:428
+msgid "Module Index"
+msgstr "मडुल अनुसुची"
+
+#: sphinx/domains/std.py:429 sphinx/themes/basic/defindex.html:25
+msgid "Search Page"
+msgstr "पानामा खोज्नुहोस्"
+
+#: sphinx/ext/autodoc.py:1002
+#, python-format
+msgid " Bases: %s"
+msgstr "Bases: %s"
+
+#: sphinx/ext/autodoc.py:1038
+#, python-format
+msgid "alias of :class:`%s`"
+msgstr "alias of :class:`%s`"
+
+#: sphinx/ext/todo.py:41
+msgid "Todo"
+msgstr "Todo"
+
+#: sphinx/ext/todo.py:109
+#, python-format
+msgid "(The <<original entry>> is located in %s, line %d.)"
+msgstr "(<<original entry>> यहाँ %s, line %d रहेको छ । "
+
+#: sphinx/ext/todo.py:117
+msgid "original entry"
+msgstr "मौलिक इन्ट्री"
+
+#: sphinx/ext/viewcode.py:70
+msgid "[source]"
+msgstr "[स्रोत]"
+
+#: sphinx/ext/viewcode.py:117
+msgid "[docs]"
+msgstr "[docs]"
+
+#: sphinx/ext/viewcode.py:131
+msgid "Module code"
+msgstr "Module code"
+
+#: sphinx/ext/viewcode.py:137
+#, python-format
+msgid "<h1>Source code for %s</h1>"
+msgstr "<h1>Source code for %s</h1>"
+
+#: sphinx/ext/viewcode.py:164
+msgid "Overview: module code"
+msgstr "पुनरावलोकन: module code"
+
+#: sphinx/ext/viewcode.py:165
+msgid "<h1>All modules for which code is available</h1>"
+msgstr "<h1>All modules for which code is available</h1>"
+
+#: sphinx/locale/__init__.py:155
+msgid "Attention"
+msgstr "ध्यानाकर्षण"
+
+#: sphinx/locale/__init__.py:156
+msgid "Caution"
+msgstr "होसियार "
+
+#: sphinx/locale/__init__.py:157
+msgid "Danger"
+msgstr "खतरा"
+
+#: sphinx/locale/__init__.py:158
+msgid "Error"
+msgstr "गलत"
+
+#: sphinx/locale/__init__.py:159
+msgid "Hint"
+msgstr "सङ्केत"
+
+#: sphinx/locale/__init__.py:160
+msgid "Important"
+msgstr "जरुरी"
+
+#: sphinx/locale/__init__.py:161
+msgid "Note"
+msgstr "टिप्पणी"
+
+#: sphinx/locale/__init__.py:162
+msgid "See Also"
+msgstr "पनि हेर्नुहोस्"
+
+#: sphinx/locale/__init__.py:163
+msgid "Tip"
+msgstr "Tip"
+
+#: sphinx/locale/__init__.py:164
+msgid "Warning"
+msgstr "साबधान"
+
+#: sphinx/locale/__init__.py:168
+#, python-format
+msgid "New in version %s"
+msgstr "भर्सन %s मा नयाँ"
+
+#: sphinx/locale/__init__.py:169
+#, python-format
+msgid "Changed in version %s"
+msgstr "भर्सन %s मा बदलिएको"
+
+#: sphinx/locale/__init__.py:170
+#, python-format
+msgid "Deprecated since version %s"
+msgstr "Deprecated since version %s"
+
+#: sphinx/locale/__init__.py:176
+msgid "keyword"
+msgstr "मुख्य शब्द"
+
+#: sphinx/locale/__init__.py:177
+msgid "operator"
+msgstr "सन्चालक"
+
+#: sphinx/locale/__init__.py:178
+msgid "object"
+msgstr "object"
+
+#: sphinx/locale/__init__.py:180
+msgid "statement"
+msgstr "भनाई"
+
+#: sphinx/locale/__init__.py:181
+msgid "built-in function"
+msgstr "built-in फन्क्सन"
+
+#: sphinx/themes/agogo/layout.html:45 sphinx/themes/basic/globaltoc.html:10
+#: sphinx/themes/basic/localtoc.html:11
+msgid "Table Of Contents"
+msgstr "विषयसूची"
+
+#: sphinx/themes/agogo/layout.html:49 sphinx/themes/basic/layout.html:137
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:20
+msgid "Search"
+msgstr "खोज्नुहोस् "
+
+#: sphinx/themes/agogo/layout.html:52 sphinx/themes/basic/searchbox.html:15
+msgid "Go"
+msgstr "जानुहोस्"
+
+#: sphinx/themes/agogo/layout.html:57 sphinx/themes/basic/searchbox.html:20
+msgid "Enter search terms or a module, class or function name."
+msgstr "खोज्ने टर्मस् अथवा एक मडुल्, कक्षा अथवा फन्क्सनको नाम लेख्नुहोस "
+
+#: sphinx/themes/agogo/layout.html:78 sphinx/themes/basic/sourcelink.html:14
+msgid "Show Source"
+msgstr "स्रोत देखाउनुहोस् "
+
+#: sphinx/themes/basic/defindex.html:11
+msgid "Overview"
+msgstr "पुनरावलोकन "
+
+#: sphinx/themes/basic/defindex.html:20
+msgid "Indices and tables:"
+msgstr "इन्डीसीस्स र तलिका"
+
+#: sphinx/themes/basic/defindex.html:23
+msgid "Complete Table of Contents"
+msgstr "पुरा विषयसूची"
+
+#: sphinx/themes/basic/defindex.html:24
+msgid "lists all sections and subsections"
+msgstr "सबै सेक्सन र सवसेक्सन देखाउनुहोस्"
+
+#: sphinx/themes/basic/defindex.html:26
+msgid "search this documentation"
+msgstr "यो डकुमेन्ट खोज्नुहोस्"
+
+#: sphinx/themes/basic/defindex.html:28
+msgid "Global Module Index"
+msgstr "ग्लोबल मडुल अनुसुची"
+
+#: sphinx/themes/basic/defindex.html:29
+msgid "quick access to all modules"
+msgstr "सबै मोदुलेसमा छिटै जानुहोस्"
+
+#: sphinx/themes/basic/defindex.html:31
+msgid "all functions, classes, terms"
+msgstr "सबै फन्क्सनस्, कक्षाहरू र टर्मस्"
+
+#: sphinx/themes/basic/genindex-single.html:35
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr "Index &ndash; %(key)s"
+
+#: sphinx/themes/basic/genindex-single.html:63
+#: sphinx/themes/basic/genindex-split.html:24
+#: sphinx/themes/basic/genindex-split.html:38
+#: sphinx/themes/basic/genindex.html:74
+msgid "Full index on one page"
+msgstr "पुरा अनुसुची एकै पानामा"
+
+#: sphinx/themes/basic/genindex-split.html:16
+msgid "Index pages by letter"
+msgstr "अक्षर अनुसार अनुसुचीका पाना"
+
+#: sphinx/themes/basic/genindex-split.html:25
+msgid "can be huge"
+msgstr "धेरै ठुलो हुन सक्छ"
+
+#: sphinx/themes/basic/layout.html:29
+msgid "Navigation"
+msgstr "नेभिगेसन "
+
+#: sphinx/themes/basic/layout.html:122
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr "भित्र-भित्रै खोज्नुहोस्"
+
+#: sphinx/themes/basic/layout.html:131
+msgid "About these documents"
+msgstr "यी डकुमेन्टहरुको बारेमा"
+
+#: sphinx/themes/basic/layout.html:140
+msgid "Copyright"
+msgstr "कपिराइट "
+
+#: sphinx/themes/basic/layout.html:189
+#, python-format
+msgid "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
+msgstr "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
+
+#: sphinx/themes/basic/layout.html:191
+#, python-format
+msgid "&copy; Copyright %(copyright)s."
+msgstr "&copy; Copyright %(copyright)s."
+
+#: sphinx/themes/basic/layout.html:195
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr "यो भन्दा अगाडी %(last_updated)s मा अपडेट भएको"
+
+#: sphinx/themes/basic/layout.html:198
+#, python-format
+msgid ""
+"Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr "<a href=\"http://sphinx.pocoo.org/\">Sphinx</a> प्रयोग गरेर बनाइएको"
+
+#: sphinx/themes/basic/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr "खोज्नुहोस्"
+
+#: sphinx/themes/basic/relations.html:11
+msgid "Previous topic"
+msgstr "अघिल्लो विषय "
+
+#: sphinx/themes/basic/relations.html:13
+msgid "previous chapter"
+msgstr "अघिल्लो खन्ड"
+
+#: sphinx/themes/basic/relations.html:16
+msgid "Next topic"
+msgstr "पछिल्लो विषय"
+
+#: sphinx/themes/basic/relations.html:18
+msgid "next chapter"
+msgstr "पछिल्लो खन्ड"
+
+#: sphinx/themes/basic/search.html:24
+msgid ""
+"Please activate JavaScript to enable the search\n"
+" functionality."
+msgstr "खोज्ने कार्य आगाडी बढाउनको लागि जाभास्कृप्ट चलाईदिनुहोस "
+
+#: sphinx/themes/basic/search.html:29
+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/themes/basic/search.html:36
+msgid "search"
+msgstr "खोज्नुहोस्"
+
+#: sphinx/themes/basic/search.html:40
+msgid "Search Results"
+msgstr "खोजेको नतिजा"
+
+#: sphinx/themes/basic/search.html:42
+msgid "Your search did not match any results."
+msgstr "तपाईंले खोजेको कुरा कुनै नतिजासँग मिलेन "
+
+#: sphinx/themes/basic/searchbox.html:12
+msgid "Quick search"
+msgstr "छिट्टो खोज्नुहोस्"
+
+#: sphinx/themes/basic/sourcelink.html:11
+msgid "This Page"
+msgstr "यो पाना"
+
+#: sphinx/themes/basic/changes/frameset.html:5
+#: sphinx/themes/basic/changes/versionchanges.html:12
+#, python-format
+msgid "Changes in Version %(version)s &mdash; %(docstitle)s"
+msgstr "%(version)s &mdash; %(docstitle)s मा भएका फरकहरु "
+
+#: sphinx/themes/basic/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &mdash; %(docstitle)s"
+msgstr "%(filename)s &mdash; %(docstitle)s"
+
+#: sphinx/themes/basic/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr "भर्सन %(version)s मा भएका फरक हरु आफै जेनेरेट भए "
+
+#: sphinx/themes/basic/changes/versionchanges.html:18
+msgid "Library changes"
+msgstr "लाईब्रेरीका परिवर्तनहरु"
+
+#: sphinx/themes/basic/changes/versionchanges.html:23
+msgid "C API changes"
+msgstr "C API का परिवर्तनहरु "
+
+#: sphinx/themes/basic/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr "अरु परिवर्तनहरु "
+
+#: sphinx/themes/basic/static/doctools.js:154 sphinx/writers/html.py:504
+#: sphinx/writers/html.py:510
+msgid "Permalink to this headline"
+msgstr "यो शिर्षकको लागि पर्मालिन्क । "
+
+#: sphinx/themes/basic/static/doctools.js:160 sphinx/writers/html.py:92
+msgid "Permalink to this definition"
+msgstr "यो अर्थको लागि पर्मालिन्क"
+
+#: sphinx/themes/basic/static/doctools.js:189
+msgid "Hide Search Matches"
+msgstr "खोजेको नतिजाहरु लुकाउनुहोस्"
+
+#: sphinx/themes/default/static/sidebar.js:69
+msgid "Expand sidebar"
+msgstr "साइडबर ठुलो बनाउनुहोस्"
+
+#: sphinx/themes/default/static/sidebar.js:82
+#: sphinx/themes/default/static/sidebar.js:110
+msgid "Collapse sidebar"
+msgstr "साइडबर सानो बनाउनुहोस्"
+
+#: sphinx/themes/haiku/layout.html:26
+msgid "Contents"
+msgstr "विषयसूची"
+
+#: sphinx/writers/latex.py:177
+msgid "Release"
+msgstr "रीलीज"
+
+#: sphinx/writers/latex.py:594 sphinx/writers/manpage.py:182
+#: sphinx/writers/texinfo.py:589
+msgid "Footnotes"
+msgstr "फूट्नोट्स"
+
+#: sphinx/writers/latex.py:676
+msgid "continued from previous page"
+msgstr "अघिल्लो पानासँग जोडीएको"
+
+#: sphinx/writers/latex.py:681
+msgid "Continued on next page"
+msgstr "अर्को पानासँग जोडीएको"
+
+#: sphinx/writers/text.py:437
+msgid "[image]"
+msgstr "[चित्र]"
+
diff --git a/sphinx/locale/nl/LC_MESSAGES/sphinx.js b/sphinx/locale/nl/LC_MESSAGES/sphinx.js
index e21ff948..e33900af 100644
--- a/sphinx/locale/nl/LC_MESSAGES/sphinx.js
+++ b/sphinx/locale/nl/LC_MESSAGES/sphinx.js
@@ -1 +1 @@
-Documentation.addTranslations({"locale": "nl", "plural_expr": "(n != 1)", "messages": {"Search Results": "Zoekresultaten", "Preparing search...": "Het zoeken wordt voorbereid...", "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "Uw zoekopdracht leverde geen resultaten op. Controleer of alle woorden correct gespeld zijn en dat u genoeg categori\u00ebn hebt geselecteerd.", "Search finished, found %s page(s) matching the search query.": "Zoeken voltooid, %s pagina(s) gevonden.", ", in ": ", in ", "Expand sidebar": "", "Permalink to this headline": "Permalink naar deze titel", "Searching": "Zoeken", "Collapse sidebar": "", "Permalink to this definition": "Permalink naar deze definitie", "Hide Search Matches": "Zoekresultaten verbergen"}}); \ No newline at end of file
+Documentation.addTranslations({"locale": "nl", "plural_expr": "(n != 1)", "messages": {"Hide Search Matches": "Zoekresultaten verbergen", "Permalink to this definition": "Permalink naar deze definitie", "Expand sidebar": "", "Permalink to this headline": "Permalink naar deze titel", "Collapse sidebar": ""}}); \ No newline at end of file
diff --git a/sphinx/locale/nl/LC_MESSAGES/sphinx.mo b/sphinx/locale/nl/LC_MESSAGES/sphinx.mo
index 2002607f..05ee5662 100644
--- a/sphinx/locale/nl/LC_MESSAGES/sphinx.mo
+++ b/sphinx/locale/nl/LC_MESSAGES/sphinx.mo
Binary files differ
diff --git a/sphinx/locale/nl/LC_MESSAGES/sphinx.po b/sphinx/locale/nl/LC_MESSAGES/sphinx.po
index 8683db4f..473baadc 100644
--- a/sphinx/locale/nl/LC_MESSAGES/sphinx.po
+++ b/sphinx/locale/nl/LC_MESSAGES/sphinx.po
@@ -6,412 +6,406 @@ msgid ""
msgstr ""
"Project-Id-Version: Sphinx 0.5\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2009-08-06 23:04+0200\n"
-"PO-Revision-Date: 2010-05-29 16:22+0100\n"
+"POT-Creation-Date: 2011-09-21 10:06+0200\n"
+"PO-Revision-Date: 2011-01-22 14:41+0100\n"
"Last-Translator: Marijn van der Zee <marijn.vanderzee@gmail.com>\n"
"Language-Team: nl <LL@li.org>\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"
+"Generated-By: Babel 0.9.6\n"
-#: sphinx/environment.py:106
-#: sphinx/writers/latex.py:184
-#: sphinx/writers/manpage.py:67
+#: sphinx/config.py:81
+#, python-format
+msgid "%s %s documentation"
+msgstr "%s %s documentatie"
+
+#: sphinx/environment.py:119 sphinx/writers/latex.py:190
+#: sphinx/writers/manpage.py:67 sphinx/writers/texinfo.py:203
#, python-format
msgid "%B %d, %Y"
msgstr "%d. %B %Y"
-#: sphinx/roles.py:174
+#: sphinx/environment.py:1625
+#, python-format
+msgid "see %s"
+msgstr "zie %s"
+
+#: sphinx/environment.py:1628
#, python-format
-msgid "Python Enhancement Proposals!PEP %s"
-msgstr "Python Enhancement Proposals!PEP %s"
+msgid "see also %s"
+msgstr "zie %s"
-#: sphinx/builders/changes.py:72
+#: sphinx/roles.py:175
+#, python-format
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr "Python Enhancement Proposals; PEP %s"
+
+#: sphinx/builders/changes.py:73
msgid "Builtins"
msgstr "Builtins"
-#: sphinx/builders/changes.py:74
+#: sphinx/builders/changes.py:75
msgid "Module level"
msgstr "Moduleniveau"
-#: sphinx/builders/html.py:266
+#: sphinx/builders/html.py:274
#, python-format
msgid "%b %d, %Y"
msgstr "%d.%b.%Y"
-#: sphinx/builders/html.py:285
-#: sphinx/themes/basic/defindex.html:30
+#: sphinx/builders/html.py:293 sphinx/themes/basic/defindex.html:30
msgid "General Index"
msgstr "Algemene index"
-#: sphinx/builders/html.py:285
+#: sphinx/builders/html.py:293
msgid "index"
msgstr "Index"
-#: sphinx/builders/html.py:345
+#: sphinx/builders/html.py:353
msgid "next"
msgstr "volgende"
-#: sphinx/builders/html.py:354
+#: sphinx/builders/html.py:362
msgid "previous"
msgstr "vorige"
-#: sphinx/builders/latex.py:151
+#: sphinx/builders/latex.py:141 sphinx/builders/texinfo.py:196
msgid " (in "
msgstr ""
-#: sphinx/directives/other.py:127
+#: sphinx/directives/other.py:136
msgid "Section author: "
msgstr "Auteur van deze sectie: "
-#: sphinx/directives/other.py:129
+#: sphinx/directives/other.py:138
msgid "Module author: "
msgstr "Auteur van deze module: "
-#: sphinx/directives/other.py:131
+#: sphinx/directives/other.py:140
#, fuzzy
msgid "Code author: "
msgstr "Auteur van deze module: "
-#: sphinx/directives/other.py:133
+#: sphinx/directives/other.py:142
msgid "Author: "
msgstr "Auteur: "
-#: sphinx/directives/other.py:238
+#: sphinx/directives/other.py:215
msgid "See also"
msgstr "Zie ook"
-#: sphinx/domains/__init__.py:253
+#: sphinx/domains/__init__.py:244
#, python-format
msgid "%s %s"
msgstr ""
-#: sphinx/domains/c.py:51
-#: sphinx/domains/python.py:49
+#: sphinx/domains/c.py:51 sphinx/domains/python.py:95
msgid "Parameters"
msgstr "Parameters"
-#: sphinx/domains/c.py:54
-#: sphinx/domains/javascript.py:137
-#: sphinx/domains/python.py:59
+#: sphinx/domains/c.py:54 sphinx/domains/javascript.py:128
+#: sphinx/domains/python.py:107
msgid "Returns"
msgstr "Returns"
-#: sphinx/domains/c.py:56
-#: sphinx/domains/python.py:61
+#: sphinx/domains/c.py:56 sphinx/domains/python.py:109
msgid "Return type"
msgstr "Return type"
-#: sphinx/domains/c.py:133
+#: sphinx/domains/c.py:141
#, python-format
msgid "%s (C function)"
msgstr "%s (C-functie)"
-#: sphinx/domains/c.py:135
+#: sphinx/domains/c.py:143
#, python-format
msgid "%s (C member)"
msgstr "%s (C member)"
-#: sphinx/domains/c.py:137
+#: sphinx/domains/c.py:145
#, python-format
msgid "%s (C macro)"
msgstr "%s (C-macro)"
-#: sphinx/domains/c.py:139
+#: sphinx/domains/c.py:147
#, python-format
msgid "%s (C type)"
msgstr "%s (C type)"
-#: sphinx/domains/c.py:141
+#: sphinx/domains/c.py:149
#, python-format
msgid "%s (C variable)"
msgstr "%s (C-variabele)"
-#: sphinx/domains/c.py:171
-#: sphinx/domains/cpp.py:1031
-#: sphinx/domains/javascript.py:166
-#: sphinx/domains/python.py:497
+#: sphinx/domains/c.py:204 sphinx/domains/cpp.py:1060
+#: sphinx/domains/javascript.py:162 sphinx/domains/python.py:559
msgid "function"
msgstr "functie"
-#: sphinx/domains/c.py:172
-#: sphinx/domains/cpp.py:1032
+#: sphinx/domains/c.py:205 sphinx/domains/cpp.py:1061
msgid "member"
msgstr "member"
-#: sphinx/domains/c.py:173
+#: sphinx/domains/c.py:206
msgid "macro"
msgstr "macro"
-#: sphinx/domains/c.py:174
-#: sphinx/domains/cpp.py:1033
+#: sphinx/domains/c.py:207 sphinx/domains/cpp.py:1062
msgid "type"
msgstr "type"
-#: sphinx/domains/c.py:175
-#, fuzzy
+#: sphinx/domains/c.py:208
msgid "variable"
msgstr "variabele"
-#: sphinx/domains/cpp.py:876
+#: sphinx/domains/cpp.py:904
#, python-format
msgid "%s (C++ class)"
msgstr "%s (C++ klasse)"
-#: sphinx/domains/cpp.py:891
+#: sphinx/domains/cpp.py:919
#, python-format
msgid "%s (C++ type)"
msgstr "%s (C++ type)"
-#: sphinx/domains/cpp.py:910
+#: sphinx/domains/cpp.py:938
#, python-format
msgid "%s (C++ member)"
msgstr "%s (C++ member)"
-#: sphinx/domains/cpp.py:962
+#: sphinx/domains/cpp.py:990
#, python-format
msgid "%s (C++ function)"
msgstr "%s (C++ functie)"
-#: sphinx/domains/cpp.py:1030
-#: sphinx/domains/python.py:499
+#: sphinx/domains/cpp.py:1059 sphinx/domains/javascript.py:163
+#: sphinx/domains/python.py:561
msgid "class"
msgstr "klasse"
-#: sphinx/domains/javascript.py:117
-#: sphinx/domains/python.py:221
+#: sphinx/domains/javascript.py:106 sphinx/domains/python.py:254
#, python-format
msgid "%s() (built-in function)"
msgstr "%s() (geïntegreerde functie)"
-#: sphinx/domains/javascript.py:118
-#: sphinx/domains/python.py:285
+#: sphinx/domains/javascript.py:107 sphinx/domains/python.py:318
#, python-format
msgid "%s() (%s method)"
msgstr "%s() (%s methode)"
-#: sphinx/domains/javascript.py:120
+#: sphinx/domains/javascript.py:109
+#, python-format
+msgid "%s() (class)"
+msgstr "%s() (klasse)"
+
+#: sphinx/domains/javascript.py:111
#, python-format
msgid "%s (global variable or constant)"
msgstr "%s (globale variabele of constante)"
-#: sphinx/domains/javascript.py:122
-#: sphinx/domains/python.py:323
+#: sphinx/domains/javascript.py:113 sphinx/domains/python.py:356
#, python-format
msgid "%s (%s attribute)"
msgstr "%s (%s attribuut)"
-#: sphinx/domains/javascript.py:131
+#: sphinx/domains/javascript.py:122
#, fuzzy
msgid "Arguments"
msgstr "Parameters"
-#: sphinx/domains/javascript.py:134
+#: sphinx/domains/javascript.py:125
msgid "Throws"
msgstr ""
-#: sphinx/domains/javascript.py:167
-#: sphinx/domains/python.py:498
+#: sphinx/domains/javascript.py:164 sphinx/domains/python.py:560
msgid "data"
msgstr ""
-#: sphinx/domains/javascript.py:168
-#: sphinx/domains/python.py:504
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:566
msgid "attribute"
msgstr "attribuut"
-#: sphinx/domains/python.py:53
+#: sphinx/domains/python.py:100
#, fuzzy
msgid "Variables"
msgstr "Variabele"
-#: sphinx/domains/python.py:56
+#: sphinx/domains/python.py:104
msgid "Raises"
msgstr "Veroorzaakt"
-#: sphinx/domains/python.py:222
-#: sphinx/domains/python.py:279
-#: sphinx/domains/python.py:291
-#: sphinx/domains/python.py:304
+#: sphinx/domains/python.py:255 sphinx/domains/python.py:312
+#: sphinx/domains/python.py:324 sphinx/domains/python.py:337
#, python-format
msgid "%s() (in module %s)"
msgstr "%s() (in module %s)"
-#: sphinx/domains/python.py:225
+#: sphinx/domains/python.py:258
#, python-format
msgid "%s (built-in variable)"
msgstr "%s (geïntegreerde variabele)"
-#: sphinx/domains/python.py:226
-#: sphinx/domains/python.py:317
+#: sphinx/domains/python.py:259 sphinx/domains/python.py:350
#, python-format
msgid "%s (in module %s)"
msgstr "%s (in module %s)"
-#: sphinx/domains/python.py:242
+#: sphinx/domains/python.py:275
#, python-format
msgid "%s (built-in class)"
msgstr "%s (geïntegreerde klasse)"
-#: sphinx/domains/python.py:243
+#: sphinx/domains/python.py:276
#, python-format
msgid "%s (class in %s)"
msgstr "%s (klasse in %s)"
-#: sphinx/domains/python.py:283
+#: sphinx/domains/python.py:316
#, python-format
msgid "%s() (%s.%s method)"
msgstr "%s() (%s.%s methode)"
-#: sphinx/domains/python.py:295
+#: sphinx/domains/python.py:328
#, python-format
msgid "%s() (%s.%s static method)"
msgstr "%s() (%s.%s statische methode)"
-#: sphinx/domains/python.py:298
+#: sphinx/domains/python.py:331
#, python-format
msgid "%s() (%s static method)"
msgstr "%s() (%s statische methode)"
-#: sphinx/domains/python.py:308
+#: sphinx/domains/python.py:341
#, fuzzy, python-format
msgid "%s() (%s.%s class method)"
msgstr "%s() (%s.%s methode)"
-#: sphinx/domains/python.py:311
+#: sphinx/domains/python.py:344
#, fuzzy, python-format
msgid "%s() (%s class method)"
msgstr "%s() (%s methode)"
-#: sphinx/domains/python.py:321
+#: sphinx/domains/python.py:354
#, python-format
msgid "%s (%s.%s attribute)"
msgstr "%s (%s.%s attribuut)"
-#: sphinx/domains/python.py:366
-msgid "Platforms: "
-msgstr "Platformen: "
-
-#: sphinx/domains/python.py:372
+#: sphinx/domains/python.py:434
#, python-format
msgid "%s (module)"
msgstr "%s (module)"
-#: sphinx/domains/python.py:429
+#: sphinx/domains/python.py:491
#, fuzzy
msgid "Python Module Index"
msgstr "Module-index"
-#: sphinx/domains/python.py:430
+#: sphinx/domains/python.py:492
msgid "modules"
msgstr "modules"
-#: sphinx/domains/python.py:475
+#: sphinx/domains/python.py:537
msgid "Deprecated"
msgstr "Verouderd"
-#: sphinx/domains/python.py:500
-#: sphinx/locale/__init__.py:162
+#: sphinx/domains/python.py:562 sphinx/locale/__init__.py:179
msgid "exception"
msgstr "exceptie"
-#: sphinx/domains/python.py:501
+#: sphinx/domains/python.py:563
msgid "method"
msgstr ""
-#: sphinx/domains/python.py:502
-#, fuzzy, python-format
+#: sphinx/domains/python.py:564
msgid "class method"
-msgstr "%s() (%s methode)"
+msgstr ""
-#: sphinx/domains/python.py:503
+#: sphinx/domains/python.py:565
msgid "static method"
msgstr "statische methode"
-#: sphinx/domains/python.py:505
-#: sphinx/locale/__init__.py:158
+#: sphinx/domains/python.py:567 sphinx/locale/__init__.py:175
msgid "module"
msgstr "module"
-#: sphinx/domains/rst.py:53
+#: sphinx/domains/python.py:695
+msgid " (deprecated)"
+msgstr " (verouderd)"
+
+#: sphinx/domains/rst.py:55
#, python-format
msgid "%s (directive)"
msgstr ""
-#: sphinx/domains/rst.py:55
+#: sphinx/domains/rst.py:57
#, fuzzy, python-format
msgid "%s (role)"
-msgstr "%s (module)"
+msgstr "%s (rolle)"
-#: sphinx/domains/rst.py:103
+#: sphinx/domains/rst.py:106
msgid "directive"
msgstr ""
-#: sphinx/domains/rst.py:104
+#: sphinx/domains/rst.py:107
#, fuzzy
msgid "role"
-msgstr "module"
+msgstr "rolle"
-#: sphinx/domains/std.py:68
-#: sphinx/domains/std.py:84
+#: sphinx/domains/std.py:70 sphinx/domains/std.py:86
#, python-format
msgid "environment variable; %s"
msgstr "omgevingsvariabele; %s"
-#: sphinx/domains/std.py:160
+#: sphinx/domains/std.py:162
#, python-format
msgid "%scommand line option; %s"
msgstr "%sopdrachtregel optie; %s"
-#: sphinx/domains/std.py:328
+#: sphinx/domains/std.py:393
msgid "glossary term"
msgstr ""
-#: sphinx/domains/std.py:329
+#: sphinx/domains/std.py:394
msgid "grammar token"
msgstr ""
-#: sphinx/domains/std.py:330
+#: sphinx/domains/std.py:395
msgid "reference label"
msgstr ""
-#: sphinx/domains/std.py:331
+#: sphinx/domains/std.py:396
msgid "environment variable"
msgstr "omgevingsvariabele"
-#: sphinx/domains/std.py:332
+#: sphinx/domains/std.py:397
msgid "program option"
msgstr ""
-#: sphinx/domains/std.py:360
-#: sphinx/themes/basic/genindex-single.html:11
+#: sphinx/domains/std.py:427 sphinx/themes/basic/genindex-single.html:32
#: sphinx/themes/basic/genindex-split.html:11
#: sphinx/themes/basic/genindex-split.html:14
-#: sphinx/themes/basic/genindex.html:11
-#: sphinx/themes/basic/genindex.html:14
-#: sphinx/themes/basic/genindex.html:50
-#: sphinx/themes/basic/layout.html:125
-#: sphinx/writers/latex.py:173
+#: sphinx/themes/basic/genindex.html:32 sphinx/themes/basic/genindex.html:35
+#: sphinx/themes/basic/genindex.html:68 sphinx/themes/basic/layout.html:134
+#: sphinx/writers/latex.py:179 sphinx/writers/texinfo.py:456
msgid "Index"
msgstr "Index"
-#: sphinx/domains/std.py:361
+#: sphinx/domains/std.py:428
msgid "Module Index"
msgstr "Module-index"
-#: sphinx/domains/std.py:362
-#: sphinx/themes/basic/defindex.html:25
+#: sphinx/domains/std.py:429 sphinx/themes/basic/defindex.html:25
msgid "Search Page"
msgstr "Zoekpagina"
-#: sphinx/ext/autodoc.py:917
+#: sphinx/ext/autodoc.py:1002
#, python-format
msgid " Bases: %s"
msgstr ""
-#: sphinx/ext/autodoc.py:950
+#: sphinx/ext/autodoc.py:1038
#, python-format
msgid "alias of :class:`%s`"
msgstr ""
@@ -429,132 +423,125 @@ msgstr "(Het <<originele item>> is te vinden in %s, regel %d.)"
msgid "original entry"
msgstr "originele item"
-#: sphinx/ext/viewcode.py:66
+#: sphinx/ext/viewcode.py:70
msgid "[source]"
msgstr ""
-#: sphinx/ext/viewcode.py:109
+#: sphinx/ext/viewcode.py:117
msgid "[docs]"
msgstr ""
-#: sphinx/ext/viewcode.py:123
-#, fuzzy
+#: sphinx/ext/viewcode.py:131
msgid "Module code"
-msgstr "module"
+msgstr ""
-#: sphinx/ext/viewcode.py:129
+#: sphinx/ext/viewcode.py:137
#, python-format
msgid "<h1>Source code for %s</h1>"
msgstr ""
-#: sphinx/ext/viewcode.py:156
+#: sphinx/ext/viewcode.py:164
msgid "Overview: module code"
msgstr ""
-#: sphinx/ext/viewcode.py:157
+#: sphinx/ext/viewcode.py:165
msgid "<h1>All modules for which code is available</h1>"
msgstr ""
-#: sphinx/locale/__init__.py:139
+#: sphinx/locale/__init__.py:155
msgid "Attention"
msgstr "Let op"
-#: sphinx/locale/__init__.py:140
+#: sphinx/locale/__init__.py:156
msgid "Caution"
msgstr "Pas op"
-#: sphinx/locale/__init__.py:141
+#: sphinx/locale/__init__.py:157
msgid "Danger"
msgstr "Gevaar"
-#: sphinx/locale/__init__.py:142
+#: sphinx/locale/__init__.py:158
msgid "Error"
msgstr "Fout"
-#: sphinx/locale/__init__.py:143
+#: sphinx/locale/__init__.py:159
msgid "Hint"
msgstr "Hint"
-#: sphinx/locale/__init__.py:144
+#: sphinx/locale/__init__.py:160
msgid "Important"
msgstr "Belangrijk"
-#: sphinx/locale/__init__.py:145
+#: sphinx/locale/__init__.py:161
msgid "Note"
msgstr "Notitie"
-#: sphinx/locale/__init__.py:146
+#: sphinx/locale/__init__.py:162
msgid "See Also"
msgstr "Zie ook"
-#: sphinx/locale/__init__.py:147
+#: sphinx/locale/__init__.py:163
msgid "Tip"
msgstr "Tip"
-#: sphinx/locale/__init__.py:148
+#: sphinx/locale/__init__.py:164
msgid "Warning"
msgstr "Waarschuwing"
-#: sphinx/locale/__init__.py:152
+#: sphinx/locale/__init__.py:168
#, python-format
msgid "New in version %s"
msgstr "Nieuw in versie %s"
-#: sphinx/locale/__init__.py:153
+#: sphinx/locale/__init__.py:169
#, python-format
msgid "Changed in version %s"
msgstr "Veranderd in versie %s"
-#: sphinx/locale/__init__.py:154
+#: sphinx/locale/__init__.py:170
#, python-format
msgid "Deprecated since version %s"
msgstr "Verouderd sinds versie %s"
-#: sphinx/locale/__init__.py:159
+#: sphinx/locale/__init__.py:176
msgid "keyword"
msgstr "trefwoord"
-#: sphinx/locale/__init__.py:160
+#: sphinx/locale/__init__.py:177
msgid "operator"
msgstr "operator"
-#: sphinx/locale/__init__.py:161
+#: sphinx/locale/__init__.py:178
msgid "object"
msgstr "object"
-#: sphinx/locale/__init__.py:163
+#: sphinx/locale/__init__.py:180
msgid "statement"
msgstr "statement"
-#: sphinx/locale/__init__.py:164
+#: sphinx/locale/__init__.py:181
msgid "built-in function"
msgstr "ingebouwde functie"
-#: sphinx/themes/agogo/layout.html:45
-#: sphinx/themes/basic/globaltoc.html:10
+#: sphinx/themes/agogo/layout.html:45 sphinx/themes/basic/globaltoc.html:10
#: sphinx/themes/basic/localtoc.html:11
msgid "Table Of Contents"
msgstr "Inhoudsopgave"
-#: sphinx/themes/agogo/layout.html:49
-#: sphinx/themes/basic/layout.html:128
-#: sphinx/themes/basic/search.html:11
-#: sphinx/themes/basic/search.html:14
+#: sphinx/themes/agogo/layout.html:49 sphinx/themes/basic/layout.html:137
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:20
msgid "Search"
msgstr "Zoeken"
-#: sphinx/themes/agogo/layout.html:52
-#: sphinx/themes/basic/searchbox.html:15
+#: sphinx/themes/agogo/layout.html:52 sphinx/themes/basic/searchbox.html:15
msgid "Go"
msgstr "Ga"
-#: sphinx/themes/agogo/layout.html:57
-#: sphinx/themes/basic/searchbox.html:20
+#: sphinx/themes/agogo/layout.html:57 sphinx/themes/basic/searchbox.html:20
msgid "Enter search terms or a module, class or function name."
msgstr "Geef zoekterm of de naam van een module, klasse of functie."
-#: sphinx/themes/agogo/layout.html:78
-#: sphinx/themes/basic/sourcelink.html:14
+#: sphinx/themes/agogo/layout.html:78 sphinx/themes/basic/sourcelink.html:14
msgid "Show Source"
msgstr "Broncode weergeven"
@@ -590,15 +577,15 @@ msgstr "sneltoegang naar alle modules"
msgid "all functions, classes, terms"
msgstr "alle functies, klasses en begrippen"
-#: sphinx/themes/basic/genindex-single.html:14
+#: sphinx/themes/basic/genindex-single.html:35
#, python-format
msgid "Index &ndash; %(key)s"
msgstr "Index &ndash; %(key)s"
-#: sphinx/themes/basic/genindex-single.html:46
+#: sphinx/themes/basic/genindex-single.html:63
#: sphinx/themes/basic/genindex-split.html:24
#: sphinx/themes/basic/genindex-split.html:38
-#: sphinx/themes/basic/genindex.html:56
+#: sphinx/themes/basic/genindex.html:74
msgid "Full index on one page"
msgstr "Volledige index op een pagina"
@@ -610,42 +597,46 @@ msgstr "Index pagineerd per letter"
msgid "can be huge"
msgstr "kan heel groot zijn"
-#: sphinx/themes/basic/layout.html:23
+#: sphinx/themes/basic/layout.html:29
msgid "Navigation"
msgstr "Navigatie"
-#: sphinx/themes/basic/layout.html:113
+#: sphinx/themes/basic/layout.html:122
#, python-format
msgid "Search within %(docstitle)s"
msgstr "Zoeken in %(docstitle)s"
-#: sphinx/themes/basic/layout.html:122
+#: sphinx/themes/basic/layout.html:131
msgid "About these documents"
msgstr "Over deze documenten"
-#: sphinx/themes/basic/layout.html:131
+#: sphinx/themes/basic/layout.html:140
msgid "Copyright"
msgstr "Copyright"
-#: sphinx/themes/basic/layout.html:180
+#: sphinx/themes/basic/layout.html:189
#, python-format
msgid "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
msgstr "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
-#: sphinx/themes/basic/layout.html:182
+#: sphinx/themes/basic/layout.html:191
#, python-format
msgid "&copy; Copyright %(copyright)s."
msgstr "&copy; Copyright %(copyright)s."
-#: sphinx/themes/basic/layout.html:186
+#: sphinx/themes/basic/layout.html:195
#, python-format
msgid "Last updated on %(last_updated)s."
msgstr "Laatste aanpassing op %(last_updated)s."
-#: sphinx/themes/basic/layout.html:189
+#: sphinx/themes/basic/layout.html:198
#, python-format
-msgid "Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> %(sphinx_version)s."
-msgstr "Aangemaakt met <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> %(sphinx_version)s."
+msgid ""
+"Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+"Aangemaakt met <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
+"%(sphinx_version)s."
#: sphinx/themes/basic/opensearch.xml:4
#, python-format
@@ -668,13 +659,13 @@ msgstr "Volgend onderwerp"
msgid "next chapter"
msgstr "volgend hoofdstuk"
-#: sphinx/themes/basic/search.html:18
+#: sphinx/themes/basic/search.html:24
msgid ""
"Please activate JavaScript to enable the search\n"
" functionality."
msgstr "Activeer JavaSscript om de zoekfunctionaliteit in te schakelen."
-#: sphinx/themes/basic/search.html:23
+#: sphinx/themes/basic/search.html:29
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"
@@ -682,20 +673,21 @@ msgid ""
" containing fewer words won't appear in the result list."
msgstr ""
"Hier kan u de documenten doorzoeken. Geef enkele trefwoorden\n"
-" in het veld hieronder en klik \"zoeken\". Merk op dat de zoekfunctie\n"
-" steeds naar alle woorden zoekt. Pagina's die minder woorden bevatten\n"
+" in het veld hieronder en klik \"zoeken\". Merk op dat de zoekfunctie"
+"\n"
+" steeds naar alle woorden zoekt. Pagina's die minder woorden bevatten"
+"\n"
" zullen niet tussen de resultaten verschijnen."
-#: sphinx/themes/basic/search.html:30
+#: sphinx/themes/basic/search.html:36
msgid "search"
msgstr "zoeken"
-#: sphinx/themes/basic/search.html:34
-#: sphinx/themes/basic/static/searchtools.js:489
+#: sphinx/themes/basic/search.html:40
msgid "Search Results"
msgstr "Zoekresultaten"
-#: sphinx/themes/basic/search.html:36
+#: sphinx/themes/basic/search.html:42
msgid "Your search did not match any results."
msgstr "Uw zoekopdracht leverde geen resultaten op."
@@ -735,14 +727,12 @@ msgstr "Veranderingen in de C-API"
msgid "Other changes"
msgstr "Andere veranderingen"
-#: sphinx/themes/basic/static/doctools.js:154
-#: sphinx/writers/html.py:482
-#: sphinx/writers/html.py:487
+#: sphinx/themes/basic/static/doctools.js:154 sphinx/writers/html.py:504
+#: sphinx/writers/html.py:510
msgid "Permalink to this headline"
msgstr "Permalink naar deze titel"
-#: sphinx/themes/basic/static/doctools.js:160
-#: sphinx/writers/html.py:87
+#: sphinx/themes/basic/static/doctools.js:160 sphinx/writers/html.py:92
msgid "Permalink to this definition"
msgstr "Permalink naar deze definitie"
@@ -750,33 +740,12 @@ msgstr "Permalink naar deze definitie"
msgid "Hide Search Matches"
msgstr "Zoekresultaten verbergen"
-#: sphinx/themes/basic/static/searchtools.js:285
-msgid "Searching"
-msgstr "Zoeken"
-
-#: sphinx/themes/basic/static/searchtools.js:290
-msgid "Preparing search..."
-msgstr "Het zoeken wordt voorbereid..."
-
-#: sphinx/themes/basic/static/searchtools.js:364
-msgid ", in "
-msgstr ", in "
-
-#: sphinx/themes/basic/static/searchtools.js:491
-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 "Uw zoekopdracht leverde geen resultaten op. Controleer of alle woorden correct gespeld zijn en dat u genoeg categoriën hebt geselecteerd."
-
-#: sphinx/themes/basic/static/searchtools.js:493
-#, python-format
-msgid "Search finished, found %s page(s) matching the search query."
-msgstr "Zoeken voltooid, %s pagina(s) gevonden."
-
-#: sphinx/themes/default/static/sidebar.js:66
+#: sphinx/themes/default/static/sidebar.js:69
msgid "Expand sidebar"
msgstr ""
-#: sphinx/themes/default/static/sidebar.js:79
-#: sphinx/themes/default/static/sidebar.js:106
+#: sphinx/themes/default/static/sidebar.js:82
+#: sphinx/themes/default/static/sidebar.js:110
msgid "Collapse sidebar"
msgstr ""
@@ -784,33 +753,24 @@ msgstr ""
msgid "Contents"
msgstr "Inhoud"
-#: sphinx/writers/latex.py:171
+#: sphinx/writers/latex.py:177
msgid "Release"
msgstr "Release"
-#: sphinx/writers/latex.py:572
-#: sphinx/writers/manpage.py:178
+#: sphinx/writers/latex.py:594 sphinx/writers/manpage.py:182
+#: sphinx/writers/texinfo.py:589
msgid "Footnotes"
msgstr "Voetnoten"
-#: sphinx/writers/latex.py:641
+#: sphinx/writers/latex.py:676
msgid "continued from previous page"
msgstr "Vervolgd van vorige pagina"
-#: sphinx/writers/latex.py:646
+#: sphinx/writers/latex.py:681
msgid "Continued on next page"
msgstr "Vervolgd op volgende pagina"
-#: sphinx/writers/text.py:422
+#: sphinx/writers/text.py:437
msgid "[image]"
msgstr "[afbeelding]"
-#~ msgid "Parameter"
-#~ msgstr "Parameter"
-#~ msgid "here"
-#~ msgstr "hier"
-#~ msgid "module, in "
-#~ msgstr "module, in"
-#~ msgid "Platform: %s"
-#~ msgstr "Platform: %s"
-
diff --git a/sphinx/locale/pl/LC_MESSAGES/sphinx.js b/sphinx/locale/pl/LC_MESSAGES/sphinx.js
index 5823053f..6a3f5f31 100644
--- a/sphinx/locale/pl/LC_MESSAGES/sphinx.js
+++ b/sphinx/locale/pl/LC_MESSAGES/sphinx.js
@@ -1 +1 @@
-Documentation.addTranslations({"locale": "pl", "plural_expr": "(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)", "messages": {"Search Results": "Wyniki wyszukiwania", "Preparing search...": "Przygotowanie wyszukiwania...", "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "Nie znaleziono \u017cadnych pasuj\u0105cych dokument\u00f3w. Upewnij si\u0119, \u017ce wszystkie s\u0142owa s\u0105 poprawnie wpisane i \u017ce wybra\u0142e\u015b wystarczaj\u0105c\u0105liczb\u0119 kategorii.", "Search finished, found %s page(s) matching the search query.": "Przeszukiwanie zako\u0144czone, znaleziono %s pasuj\u0105cych stron.", ", in ": ", w ", "Expand sidebar": "", "Permalink to this headline": "Sta\u0142y odno\u015bnik do tego nag\u0142\u00f3wka", "Searching": "Wyszukiwanie", "Collapse sidebar": "", "Permalink to this definition": "Sta\u0142y odno\u015bnik do tej definicji", "Hide Search Matches": "Ukryj wyniki wyszukiwania"}}); \ No newline at end of file
+Documentation.addTranslations({"locale": "pl", "plural_expr": "(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)", "messages": {"Hide Search Matches": "Ukryj wyniki wyszukiwania", "Permalink to this definition": "Sta\u0142y odno\u015bnik do tej definicji", "Expand sidebar": "Rozwi\u0144 pasek boczny", "Permalink to this headline": "Sta\u0142y odno\u015bnik do tego nag\u0142\u00f3wka", "Collapse sidebar": "Zwi\u0144 pasek boczny"}}); \ No newline at end of file
diff --git a/sphinx/locale/pl/LC_MESSAGES/sphinx.mo b/sphinx/locale/pl/LC_MESSAGES/sphinx.mo
index 3c6105cd..bdceda43 100644
--- a/sphinx/locale/pl/LC_MESSAGES/sphinx.mo
+++ b/sphinx/locale/pl/LC_MESSAGES/sphinx.mo
Binary files differ
diff --git a/sphinx/locale/pl/LC_MESSAGES/sphinx.po b/sphinx/locale/pl/LC_MESSAGES/sphinx.po
index 6044e8ee..957d23e9 100644
--- a/sphinx/locale/pl/LC_MESSAGES/sphinx.po
+++ b/sphinx/locale/pl/LC_MESSAGES/sphinx.po
@@ -3,505 +3,516 @@ msgid ""
msgstr ""
"Project-Id-Version: Sphinx 0.5\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2008-08-10 11:43+0000\n"
-"PO-Revision-Date: 2010-05-24 23:54+0200\n"
-"Last-Translator: Michał Kandulski <Michal.Kandulski@poczta.onet.pl>\n"
+"POT-Creation-Date: 2011-09-21 10:06+0200\n"
+"PO-Revision-Date: 2011-09-21 10:14+0200\n"
+"Last-Translator: Michał Kandulski <michal.kandulski@gmail.com>\n"
"Language-Team: \n"
"Plural-Forms: nplurals=3; plural=(n==1 ? 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"
+"Generated-By: Babel 0.9.6\n"
-#: sphinx/environment.py:106 sphinx/writers/latex.py:184
-#: sphinx/writers/manpage.py:67
+#: sphinx/config.py:81
+#, python-format
+msgid "%s %s documentation"
+msgstr ""
+
+#: sphinx/environment.py:119 sphinx/writers/latex.py:190
+#: sphinx/writers/manpage.py:67 sphinx/writers/texinfo.py:203
#, python-format
msgid "%B %d, %Y"
msgstr "%B %d %Y"
-#: sphinx/roles.py:174
+#: sphinx/environment.py:1625
+#, fuzzy, python-format
+msgid "see %s"
+msgstr "zobacz %s"
+
+#: sphinx/environment.py:1628
+#, fuzzy, python-format
+msgid "see also %s"
+msgstr "zobacz także %s"
+
+#: sphinx/roles.py:175
#, python-format
-msgid "Python Enhancement Proposals!PEP %s"
-msgstr "Python Enhancement Proposals!PEP %s"
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr "Python Enhancement Proposals; PEP %s"
-#: sphinx/builders/changes.py:72
+#: sphinx/builders/changes.py:73
msgid "Builtins"
msgstr "Wbudowane"
-#: sphinx/builders/changes.py:74
+#: sphinx/builders/changes.py:75
msgid "Module level"
msgstr "Poziom modułu"
-#: sphinx/builders/html.py:266
+#: sphinx/builders/html.py:274
#, python-format
msgid "%b %d, %Y"
msgstr "%b %d %Y"
-#: sphinx/builders/html.py:285 sphinx/themes/basic/defindex.html:30
+#: sphinx/builders/html.py:293 sphinx/themes/basic/defindex.html:30
msgid "General Index"
msgstr "Indeks ogólny"
-#: sphinx/builders/html.py:285
+#: sphinx/builders/html.py:293
msgid "index"
msgstr "indeks"
-#: sphinx/builders/html.py:345
+#: sphinx/builders/html.py:353
msgid "next"
msgstr "dalej"
-#: sphinx/builders/html.py:354
+#: sphinx/builders/html.py:362
msgid "previous"
msgstr "wstecz"
-#: sphinx/builders/latex.py:151
+#: sphinx/builders/latex.py:141 sphinx/builders/texinfo.py:196
msgid " (in "
msgstr " (w "
-#: sphinx/directives/other.py:127
+#: sphinx/directives/other.py:136
msgid "Section author: "
msgstr "Autor rozdziału: "
-#: sphinx/directives/other.py:129
+#: sphinx/directives/other.py:138
msgid "Module author: "
msgstr "Autor modułu: "
-#: sphinx/directives/other.py:131
-#, fuzzy
+#: sphinx/directives/other.py:140
msgid "Code author: "
-msgstr "Autor modułu: "
+msgstr "Autor kodu: "
-#: sphinx/directives/other.py:133
+#: sphinx/directives/other.py:142
msgid "Author: "
msgstr "Autor: "
-#: sphinx/directives/other.py:238
+#: sphinx/directives/other.py:215
msgid "See also"
msgstr "Zobacz także"
-#: sphinx/domains/__init__.py:253
+#: sphinx/domains/__init__.py:244
#, python-format
msgid "%s %s"
-msgstr ""
+msgstr "%s %s"
-#: sphinx/domains/c.py:51 sphinx/domains/python.py:49
+#: sphinx/domains/c.py:51 sphinx/domains/python.py:95
msgid "Parameters"
msgstr "Parametry"
-#: sphinx/domains/c.py:54 sphinx/domains/javascript.py:137
-#: sphinx/domains/python.py:59
+#: sphinx/domains/c.py:54 sphinx/domains/javascript.py:128
+#: sphinx/domains/python.py:107
msgid "Returns"
msgstr "Zwraca"
-#: sphinx/domains/c.py:56 sphinx/domains/python.py:61
+#: sphinx/domains/c.py:56 sphinx/domains/python.py:109
msgid "Return type"
msgstr "Typ zwracany"
-#: sphinx/domains/c.py:133
+#: sphinx/domains/c.py:141
#, python-format
msgid "%s (C function)"
msgstr "%s (funkcja C)"
-#: sphinx/domains/c.py:135
+#: sphinx/domains/c.py:143
#, python-format
msgid "%s (C member)"
msgstr "%s (pole C)"
-#: sphinx/domains/c.py:137
+#: sphinx/domains/c.py:145
#, python-format
msgid "%s (C macro)"
msgstr "%s (makro C)"
-#: sphinx/domains/c.py:139
+#: sphinx/domains/c.py:147
#, python-format
msgid "%s (C type)"
msgstr "%s (typ C)"
-#: sphinx/domains/c.py:141
+#: sphinx/domains/c.py:149
#, python-format
msgid "%s (C variable)"
msgstr "%s (zmienna C)"
-#: sphinx/domains/c.py:171 sphinx/domains/cpp.py:1031
-#: sphinx/domains/javascript.py:166 sphinx/domains/python.py:497
+#: sphinx/domains/c.py:204 sphinx/domains/cpp.py:1060
+#: sphinx/domains/javascript.py:162 sphinx/domains/python.py:559
msgid "function"
msgstr "funkcja"
-#: sphinx/domains/c.py:172 sphinx/domains/cpp.py:1032
+#: sphinx/domains/c.py:205 sphinx/domains/cpp.py:1061
msgid "member"
msgstr "pole"
-#: sphinx/domains/c.py:173
+#: sphinx/domains/c.py:206
msgid "macro"
-msgstr ""
+msgstr "makro"
-#: sphinx/domains/c.py:174 sphinx/domains/cpp.py:1033
+#: sphinx/domains/c.py:207 sphinx/domains/cpp.py:1062
msgid "type"
msgstr "typ"
-#: sphinx/domains/c.py:175
-#, fuzzy
+#: sphinx/domains/c.py:208
msgid "variable"
-msgstr "Zmienna"
+msgstr "zmienna"
-#: sphinx/domains/cpp.py:876
+#: sphinx/domains/cpp.py:904
#, python-format
msgid "%s (C++ class)"
-msgstr "%s (klasie C++)"
+msgstr "%s (klasa C++)"
-#: sphinx/domains/cpp.py:891
+#: sphinx/domains/cpp.py:919
#, python-format
msgid "%s (C++ type)"
msgstr "%s (typ C++)"
-#: sphinx/domains/cpp.py:910
+#: sphinx/domains/cpp.py:938
#, python-format
msgid "%s (C++ member)"
msgstr "%s (pole C++)"
-#: sphinx/domains/cpp.py:962
+#: sphinx/domains/cpp.py:990
#, python-format
msgid "%s (C++ function)"
msgstr "%s (funkcja C++)"
-#: sphinx/domains/cpp.py:1030 sphinx/domains/python.py:499
+#: sphinx/domains/cpp.py:1059 sphinx/domains/javascript.py:163
+#: sphinx/domains/python.py:561
msgid "class"
-msgstr "klasie"
+msgstr "klasa"
-#: sphinx/domains/javascript.py:117 sphinx/domains/python.py:221
+#: sphinx/domains/javascript.py:106 sphinx/domains/python.py:254
#, python-format
msgid "%s() (built-in function)"
msgstr "%s() (funkcja wbudowana)"
-#: sphinx/domains/javascript.py:118 sphinx/domains/python.py:285
+#: sphinx/domains/javascript.py:107 sphinx/domains/python.py:318
#, python-format
msgid "%s() (%s method)"
msgstr "%s() (%s metoda)"
-#: sphinx/domains/javascript.py:120
+#: sphinx/domains/javascript.py:109
+#, python-format
+msgid "%s() (class)"
+msgstr "%s() (klasa)"
+
+#: sphinx/domains/javascript.py:111
#, python-format
msgid "%s (global variable or constant)"
-msgstr ""
+msgstr "%s (zmienna lub stała globalna)"
-#: sphinx/domains/javascript.py:122 sphinx/domains/python.py:323
+#: sphinx/domains/javascript.py:113 sphinx/domains/python.py:356
#, python-format
msgid "%s (%s attribute)"
msgstr "%s (%s atrybut)"
-#: sphinx/domains/javascript.py:131
-#, fuzzy
+#: sphinx/domains/javascript.py:122
msgid "Arguments"
-msgstr "Parametry"
+msgstr "Argumenty"
-#: sphinx/domains/javascript.py:134
+#: sphinx/domains/javascript.py:125
msgid "Throws"
-msgstr ""
+msgstr "Wyrzuca"
-#: sphinx/domains/javascript.py:167 sphinx/domains/python.py:498
+#: sphinx/domains/javascript.py:164 sphinx/domains/python.py:560
msgid "data"
-msgstr ""
+msgstr "dane"
-#: sphinx/domains/javascript.py:168 sphinx/domains/python.py:504
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:566
msgid "attribute"
msgstr "atrybut"
-#: sphinx/domains/python.py:53
-#, fuzzy
+#: sphinx/domains/python.py:100
msgid "Variables"
-msgstr "Zmienna"
+msgstr "Zmienne"
-#: sphinx/domains/python.py:56
+#: sphinx/domains/python.py:104
msgid "Raises"
msgstr "Wyrzuca"
-#: sphinx/domains/python.py:222 sphinx/domains/python.py:279
-#: sphinx/domains/python.py:291 sphinx/domains/python.py:304
+#: sphinx/domains/python.py:255 sphinx/domains/python.py:312
+#: sphinx/domains/python.py:324 sphinx/domains/python.py:337
#, python-format
msgid "%s() (in module %s)"
msgstr "%s() (w module %s)"
-#: sphinx/domains/python.py:225
+#: sphinx/domains/python.py:258
#, python-format
msgid "%s (built-in variable)"
msgstr "%s (zmienna wbudowana)"
-#: sphinx/domains/python.py:226 sphinx/domains/python.py:317
+#: sphinx/domains/python.py:259 sphinx/domains/python.py:350
#, python-format
msgid "%s (in module %s)"
msgstr "%s (w module %s)"
-#: sphinx/domains/python.py:242
+#: sphinx/domains/python.py:275
#, python-format
msgid "%s (built-in class)"
msgstr "%s (klasa wbudowana)"
-#: sphinx/domains/python.py:243
+#: sphinx/domains/python.py:276
#, python-format
msgid "%s (class in %s)"
-msgstr "%s (w klasie %s)"
+msgstr "%s (klasa w module %s)"
-#: sphinx/domains/python.py:283
+#: sphinx/domains/python.py:316
#, python-format
msgid "%s() (%s.%s method)"
msgstr "%s() (%s.%s metoda)"
-#: sphinx/domains/python.py:295
+#: sphinx/domains/python.py:328
#, python-format
msgid "%s() (%s.%s static method)"
-msgstr "%s() (%s.%s statyczna metoda)"
+msgstr "%s() (%s.%s metoda statyczna)"
-#: sphinx/domains/python.py:298
+#: sphinx/domains/python.py:331
#, python-format
msgid "%s() (%s static method)"
-msgstr "%s() (%s statyczna metoda)"
+msgstr "%s() (%s metoda statyczna)"
-#: sphinx/domains/python.py:308
-#, fuzzy, python-format
+#: sphinx/domains/python.py:341
+#, python-format
msgid "%s() (%s.%s class method)"
-msgstr "%s() (%s.%s metoda)"
+msgstr "%s() (%s.%s metoda klasy)"
-#: sphinx/domains/python.py:311
-#, fuzzy, python-format
+#: sphinx/domains/python.py:344
+#, python-format
msgid "%s() (%s class method)"
-msgstr "%s() (%s metoda)"
+msgstr "%s() (%s metoda klasy)"
-#: sphinx/domains/python.py:321
+#: sphinx/domains/python.py:354
#, python-format
msgid "%s (%s.%s attribute)"
-msgstr "%s (%s.%s atrybut)"
-
-#: sphinx/domains/python.py:366
-msgid "Platforms: "
-msgstr "Platformy: "
+msgstr "%s (atrybut %s.%s)"
-#: sphinx/domains/python.py:372
+#: sphinx/domains/python.py:434
#, python-format
msgid "%s (module)"
msgstr "%s (moduł)"
-#: sphinx/domains/python.py:429
-#, fuzzy
+#: sphinx/domains/python.py:491
msgid "Python Module Index"
-msgstr "Indeks modułów"
+msgstr "Indeks modułów pythona"
-#: sphinx/domains/python.py:430
+#: sphinx/domains/python.py:492
msgid "modules"
msgstr "moduły"
-#: sphinx/domains/python.py:475
+#: sphinx/domains/python.py:537
msgid "Deprecated"
msgstr "Niezalecane"
-#: sphinx/domains/python.py:500 sphinx/locale/__init__.py:162
+#: sphinx/domains/python.py:562 sphinx/locale/__init__.py:179
msgid "exception"
msgstr "wyjątek"
-#: sphinx/domains/python.py:501
+#: sphinx/domains/python.py:563
msgid "method"
-msgstr ""
+msgstr "metoda"
-#: sphinx/domains/python.py:502
-#, fuzzy, python-format
+#: sphinx/domains/python.py:564
msgid "class method"
-msgstr "%s() (%s metoda)"
+msgstr "metoda klasy"
-#: sphinx/domains/python.py:503
+#: sphinx/domains/python.py:565
msgid "static method"
msgstr "statyczna metoda"
-#: sphinx/domains/python.py:505 sphinx/locale/__init__.py:158
+#: sphinx/domains/python.py:567 sphinx/locale/__init__.py:175
msgid "module"
msgstr "moduł"
-#: sphinx/domains/rst.py:53
+#: sphinx/domains/python.py:695
+msgid " (deprecated)"
+msgstr " (niezalecane)"
+
+#: sphinx/domains/rst.py:55
#, python-format
msgid "%s (directive)"
-msgstr ""
+msgstr "%s (dyrektywa)"
-#: sphinx/domains/rst.py:55
-#, fuzzy, python-format
+#: sphinx/domains/rst.py:57
+#, python-format
msgid "%s (role)"
-msgstr "%s (moduł)"
+msgstr "%s (rola)"
-#: sphinx/domains/rst.py:103
+#: sphinx/domains/rst.py:106
msgid "directive"
-msgstr ""
+msgstr "dyrektywa"
-#: sphinx/domains/rst.py:104
-#, fuzzy
+#: sphinx/domains/rst.py:107
msgid "role"
-msgstr "moduł"
+msgstr "rola"
-#: sphinx/domains/std.py:68 sphinx/domains/std.py:84
+#: sphinx/domains/std.py:70 sphinx/domains/std.py:86
#, python-format
msgid "environment variable; %s"
msgstr "zmienna środowiskowa; %s"
-#: sphinx/domains/std.py:160
+#: sphinx/domains/std.py:162
#, python-format
msgid "%scommand line option; %s"
msgstr "%sopcja linii komend; %s"
-#: sphinx/domains/std.py:328
+#: sphinx/domains/std.py:393
msgid "glossary term"
-msgstr ""
+msgstr "termin glosariusza"
-#: sphinx/domains/std.py:329
+#: sphinx/domains/std.py:394
msgid "grammar token"
-msgstr ""
+msgstr "symbol gramatyki"
-#: sphinx/domains/std.py:330
+#: sphinx/domains/std.py:395
msgid "reference label"
-msgstr ""
+msgstr "etykieta odsyłacza"
-#: sphinx/domains/std.py:331
+#: sphinx/domains/std.py:396
msgid "environment variable"
msgstr "zmienna środowiskowa"
-#: sphinx/domains/std.py:332
+#: sphinx/domains/std.py:397
msgid "program option"
-msgstr ""
+msgstr "opcja programu"
-#: sphinx/domains/std.py:360 sphinx/themes/basic/genindex-single.html:11
+#: sphinx/domains/std.py:427 sphinx/themes/basic/genindex-single.html:32
#: sphinx/themes/basic/genindex-split.html:11
#: sphinx/themes/basic/genindex-split.html:14
-#: sphinx/themes/basic/genindex.html:11 sphinx/themes/basic/genindex.html:14
-#: sphinx/themes/basic/genindex.html:50 sphinx/themes/basic/layout.html:125
-#: sphinx/writers/latex.py:173
+#: sphinx/themes/basic/genindex.html:32 sphinx/themes/basic/genindex.html:35
+#: sphinx/themes/basic/genindex.html:68 sphinx/themes/basic/layout.html:134
+#: sphinx/writers/latex.py:179 sphinx/writers/texinfo.py:456
msgid "Index"
msgstr "Indeks"
-#: sphinx/domains/std.py:361
+#: sphinx/domains/std.py:428
msgid "Module Index"
msgstr "Indeks modułów"
-#: sphinx/domains/std.py:362 sphinx/themes/basic/defindex.html:25
+#: sphinx/domains/std.py:429 sphinx/themes/basic/defindex.html:25
msgid "Search Page"
msgstr "Wyszukiwanie"
-#: sphinx/ext/autodoc.py:917
+#: sphinx/ext/autodoc.py:1002
#, python-format
msgid " Bases: %s"
msgstr " Klasy bazowe: %s"
-#: sphinx/ext/autodoc.py:950
+#: sphinx/ext/autodoc.py:1038
#, python-format
msgid "alias of :class:`%s`"
msgstr "alias klasy :class:`%s`"
#: sphinx/ext/todo.py:41
msgid "Todo"
-msgstr "Do zrobienia"
+msgstr "Todo"
#: sphinx/ext/todo.py:109
-#, fuzzy, python-format
+#, python-format
msgid "(The <<original entry>> is located in %s, line %d.)"
-msgstr ""
-"(Oryginalny wpis znajduje się w pliku %s, w linii %d i może być "
-"odnaleziony "
+msgstr "(<<Oryginalny wpis>> znajduje się w pliku %s, w linii %d.)"
#: sphinx/ext/todo.py:117
msgid "original entry"
-msgstr ""
+msgstr "oryginalny wpis"
-#: sphinx/ext/viewcode.py:66
+#: sphinx/ext/viewcode.py:70
msgid "[source]"
-msgstr ""
+msgstr "[źródło]"
-#: sphinx/ext/viewcode.py:109
+#: sphinx/ext/viewcode.py:117
msgid "[docs]"
-msgstr ""
+msgstr "[dokumenty]"
-#: sphinx/ext/viewcode.py:123
-#, fuzzy
+#: sphinx/ext/viewcode.py:131
msgid "Module code"
-msgstr "moduł"
+msgstr "Kod modułu"
-#: sphinx/ext/viewcode.py:129
+#: sphinx/ext/viewcode.py:137
#, python-format
msgid "<h1>Source code for %s</h1>"
-msgstr ""
+msgstr "<h1>Kod źródłowy modułu %s</h1>"
-#: sphinx/ext/viewcode.py:156
+#: sphinx/ext/viewcode.py:164
msgid "Overview: module code"
-msgstr ""
+msgstr "Przeglądanie: kod modułu"
-#: sphinx/ext/viewcode.py:157
+#: sphinx/ext/viewcode.py:165
msgid "<h1>All modules for which code is available</h1>"
-msgstr ""
+msgstr "<h1>Wszystkie moduły, dla których jest dostępny kod</h1>"
-#: sphinx/locale/__init__.py:139
+#: sphinx/locale/__init__.py:155
msgid "Attention"
msgstr "Uwaga"
-#: sphinx/locale/__init__.py:140
+#: sphinx/locale/__init__.py:156
msgid "Caution"
msgstr "Ostrożnie"
-#: sphinx/locale/__init__.py:141
+#: sphinx/locale/__init__.py:157
msgid "Danger"
msgstr "Niebezpieczeństwo"
-#: sphinx/locale/__init__.py:142
+#: sphinx/locale/__init__.py:158
msgid "Error"
msgstr "Błąd"
-#: sphinx/locale/__init__.py:143
+#: sphinx/locale/__init__.py:159
msgid "Hint"
msgstr "Podpowiedź"
-#: sphinx/locale/__init__.py:144
+#: sphinx/locale/__init__.py:160
msgid "Important"
msgstr "Ważne"
-#: sphinx/locale/__init__.py:145
+#: sphinx/locale/__init__.py:161
msgid "Note"
msgstr "Uwaga"
-#: sphinx/locale/__init__.py:146
+#: sphinx/locale/__init__.py:162
msgid "See Also"
msgstr "Zobacz także"
-#: sphinx/locale/__init__.py:147
+#: sphinx/locale/__init__.py:163
msgid "Tip"
msgstr "Wskazówka"
-#: sphinx/locale/__init__.py:148
+#: sphinx/locale/__init__.py:164
msgid "Warning"
msgstr "Ostrzeżenie"
-#: sphinx/locale/__init__.py:152
+#: sphinx/locale/__init__.py:168
#, python-format
msgid "New in version %s"
msgstr "Nowe w wersji %s"
-#: sphinx/locale/__init__.py:153
+#: sphinx/locale/__init__.py:169
#, python-format
msgid "Changed in version %s"
msgstr "Zmienione w wersji %s"
-#: sphinx/locale/__init__.py:154
+#: sphinx/locale/__init__.py:170
#, python-format
msgid "Deprecated since version %s"
msgstr "Niezalecane od wersji %s"
-#: sphinx/locale/__init__.py:159
+#: sphinx/locale/__init__.py:176
msgid "keyword"
msgstr "słowo kluczowe"
-#: sphinx/locale/__init__.py:160
+#: sphinx/locale/__init__.py:177
msgid "operator"
msgstr "operator"
-#: sphinx/locale/__init__.py:161
+#: sphinx/locale/__init__.py:178
msgid "object"
msgstr "obiekt"
-#: sphinx/locale/__init__.py:163
+#: sphinx/locale/__init__.py:180
msgid "statement"
msgstr "instrukcja"
-#: sphinx/locale/__init__.py:164
+#: sphinx/locale/__init__.py:181
msgid "built-in function"
msgstr "funkcja wbudowana"
@@ -510,8 +521,8 @@ msgstr "funkcja wbudowana"
msgid "Table Of Contents"
msgstr "Spis treści"
-#: sphinx/themes/agogo/layout.html:49 sphinx/themes/basic/layout.html:128
-#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:14
+#: sphinx/themes/agogo/layout.html:49 sphinx/themes/basic/layout.html:137
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:20
msgid "Search"
msgstr "Szukaj"
@@ -541,15 +552,15 @@ msgstr "Kompletny spis treści"
#: sphinx/themes/basic/defindex.html:24
msgid "lists all sections and subsections"
-msgstr "wymień wszystkie rozdziały i podrozdziały"
+msgstr "wszystkie rozdziały i podrozdziały"
#: sphinx/themes/basic/defindex.html:26
msgid "search this documentation"
-msgstr "wyszukaj w dokumentacji"
+msgstr "przyszukaj tę dokumentację"
#: sphinx/themes/basic/defindex.html:28
msgid "Global Module Index"
-msgstr "Indeks modułów"
+msgstr "Globalny indeks modułów"
#: sphinx/themes/basic/defindex.html:29
msgid "quick access to all modules"
@@ -559,15 +570,15 @@ msgstr "szybki dostęp do wszystkich modułów"
msgid "all functions, classes, terms"
msgstr "wszystkie funkcje, klasy, terminy"
-#: sphinx/themes/basic/genindex-single.html:14
+#: sphinx/themes/basic/genindex-single.html:35
#, python-format
msgid "Index &ndash; %(key)s"
msgstr "Indeks &ndash; %(key)s"
-#: sphinx/themes/basic/genindex-single.html:46
+#: sphinx/themes/basic/genindex-single.html:63
#: sphinx/themes/basic/genindex-split.html:24
#: sphinx/themes/basic/genindex-split.html:38
-#: sphinx/themes/basic/genindex.html:56
+#: sphinx/themes/basic/genindex.html:74
msgid "Full index on one page"
msgstr "Cały indeks na jednej stronie"
@@ -579,39 +590,39 @@ msgstr "Strony indeksu alfabetycznie"
msgid "can be huge"
msgstr "może być ogromny"
-#: sphinx/themes/basic/layout.html:23
+#: sphinx/themes/basic/layout.html:29
msgid "Navigation"
msgstr "Nawigacja"
-#: sphinx/themes/basic/layout.html:113
+#: sphinx/themes/basic/layout.html:122
#, python-format
msgid "Search within %(docstitle)s"
msgstr "Szukaj pośród %(docstitle)s"
-#: sphinx/themes/basic/layout.html:122
+#: sphinx/themes/basic/layout.html:131
msgid "About these documents"
msgstr "O tych dokumentach"
-#: sphinx/themes/basic/layout.html:131
+#: sphinx/themes/basic/layout.html:140
msgid "Copyright"
msgstr "Copyright"
-#: sphinx/themes/basic/layout.html:180
+#: sphinx/themes/basic/layout.html:189
#, python-format
msgid "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
msgstr "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
-#: sphinx/themes/basic/layout.html:182
+#: sphinx/themes/basic/layout.html:191
#, python-format
msgid "&copy; Copyright %(copyright)s."
msgstr "&copy; Copyright %(copyright)s."
-#: sphinx/themes/basic/layout.html:186
+#: sphinx/themes/basic/layout.html:195
#, python-format
msgid "Last updated on %(last_updated)s."
msgstr "Ostatnia modyfikacja %(last_updated)s."
-#: sphinx/themes/basic/layout.html:189
+#: sphinx/themes/basic/layout.html:198
#, python-format
msgid ""
"Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
@@ -641,13 +652,13 @@ msgstr "Następny temat"
msgid "next chapter"
msgstr "następny rozdział"
-#: sphinx/themes/basic/search.html:18
+#: sphinx/themes/basic/search.html:24
msgid ""
"Please activate JavaScript to enable the search\n"
" functionality."
msgstr "Aby umożliwić wuszukiwanie, proszę włączyć JavaScript."
-#: sphinx/themes/basic/search.html:23
+#: sphinx/themes/basic/search.html:29
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"
@@ -661,16 +672,15 @@ msgstr ""
" nie zawierające wszystkich wpisanych słów nie znajdą się na wynikowej"
" liście."
-#: sphinx/themes/basic/search.html:30
+#: sphinx/themes/basic/search.html:36
msgid "search"
-msgstr "Szukaj"
+msgstr "szukaj"
-#: sphinx/themes/basic/search.html:34
-#: sphinx/themes/basic/static/searchtools.js:489
+#: sphinx/themes/basic/search.html:40
msgid "Search Results"
msgstr "Wyniki wyszukiwania"
-#: sphinx/themes/basic/search.html:36
+#: sphinx/themes/basic/search.html:42
msgid "Your search did not match any results."
msgstr "Nie znaleziono żadnych pasujących stron."
@@ -710,12 +720,12 @@ msgstr "Zmiany w C API"
msgid "Other changes"
msgstr "Inne zmiany"
-#: sphinx/themes/basic/static/doctools.js:154 sphinx/writers/html.py:482
-#: sphinx/writers/html.py:487
+#: sphinx/themes/basic/static/doctools.js:154 sphinx/writers/html.py:504
+#: sphinx/writers/html.py:510
msgid "Permalink to this headline"
msgstr "Stały odnośnik do tego nagłówka"
-#: sphinx/themes/basic/static/doctools.js:160 sphinx/writers/html.py:87
+#: sphinx/themes/basic/static/doctools.js:160 sphinx/writers/html.py:92
msgid "Permalink to this definition"
msgstr "Stały odnośnik do tej definicji"
@@ -723,73 +733,37 @@ msgstr "Stały odnośnik do tej definicji"
msgid "Hide Search Matches"
msgstr "Ukryj wyniki wyszukiwania"
-#: sphinx/themes/basic/static/searchtools.js:285
-msgid "Searching"
-msgstr "Wyszukiwanie"
-
-#: sphinx/themes/basic/static/searchtools.js:290
-msgid "Preparing search..."
-msgstr "Przygotowanie wyszukiwania..."
-
-#: sphinx/themes/basic/static/searchtools.js:364
-msgid ", in "
-msgstr ", w "
-
-#: sphinx/themes/basic/static/searchtools.js:491
-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 ""
-"Nie znaleziono żadnych pasujących dokumentów. Upewnij się, że wszystkie "
-"słowa są poprawnie wpisane i że wybrałeś wystarczającąliczbę kategorii."
-
-#: sphinx/themes/basic/static/searchtools.js:493
-#, python-format
-msgid "Search finished, found %s page(s) matching the search query."
-msgstr "Przeszukiwanie zakończone, znaleziono %s pasujących stron."
-
-#: sphinx/themes/default/static/sidebar.js:66
+#: sphinx/themes/default/static/sidebar.js:69
msgid "Expand sidebar"
-msgstr ""
+msgstr "Rozwiń pasek boczny"
-#: sphinx/themes/default/static/sidebar.js:79
-#: sphinx/themes/default/static/sidebar.js:106
+#: sphinx/themes/default/static/sidebar.js:82
+#: sphinx/themes/default/static/sidebar.js:110
msgid "Collapse sidebar"
-msgstr ""
+msgstr "Zwiń pasek boczny"
#: sphinx/themes/haiku/layout.html:26
msgid "Contents"
-msgstr ""
+msgstr "Treść"
-#: sphinx/writers/latex.py:171
+#: sphinx/writers/latex.py:177
msgid "Release"
msgstr "Wydanie"
-#: sphinx/writers/latex.py:572 sphinx/writers/manpage.py:178
+#: sphinx/writers/latex.py:594 sphinx/writers/manpage.py:182
+#: sphinx/writers/texinfo.py:589
msgid "Footnotes"
msgstr "Przypisy"
-#: sphinx/writers/latex.py:641
+#: sphinx/writers/latex.py:676
msgid "continued from previous page"
msgstr "kontynuacja poprzedniej strony"
-#: sphinx/writers/latex.py:646
+#: sphinx/writers/latex.py:681
msgid "Continued on next page"
msgstr "Kontynuacja na następnej stronie"
-#: sphinx/writers/text.py:422
+#: sphinx/writers/text.py:437
msgid "[image]"
-msgstr "[obrazek]"
-
-#~ msgid "Parameter"
-#~ msgstr "Parametr"
-
-#~ msgid "here"
-#~ msgstr "tutaj"
-
-#~ msgid "module, in "
-#~ msgstr "moduł, w "
-
-#~ msgid "Platform: %s"
-#~ msgstr "Platforma: %s"
+msgstr "[obraz]"
diff --git a/sphinx/locale/pt_BR/LC_MESSAGES/sphinx.js b/sphinx/locale/pt_BR/LC_MESSAGES/sphinx.js
index 312d0fc7..288c9692 100644
--- a/sphinx/locale/pt_BR/LC_MESSAGES/sphinx.js
+++ b/sphinx/locale/pt_BR/LC_MESSAGES/sphinx.js
@@ -1 +1 @@
-Documentation.addTranslations({"locale": "pt_BR", "plural_expr": "(n > 1)", "messages": {"Search Results": "Resultados da Pesquisa", "Preparing search...": "Preparando pesquisa...", "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "Sua pesquisa n\u00e3o encontrou nenhum documento. Por favor assegure-se de que todas as palavras foram digitadas corretamente e de que voc\u00ea tenha selecionado o m\u00ednimo de categorias.", "Search finished, found %s page(s) matching the search query.": "Pesquisa finalizada, foram encontrada(s) %s p\u00e1gina(s) que conferem com o crit\u00e9rio de pesquisa.", ", in ": ", em ", "Expand sidebar": "Expandir painel lateral", "Permalink to this headline": "Link permanente para este t\u00edtulo", "Searching": "Pesquisando", "Collapse sidebar": "Recolher painel lateral", "Permalink to this definition": "Link permanente para esta defini\u00e7\u00e3o", "Hide Search Matches": "Esconder Resultados da Pesquisa"}}); \ No newline at end of file
+Documentation.addTranslations({"locale": "pt_BR", "plural_expr": "(n > 1)", "messages": {"Hide Search Matches": "Esconder Resultados da Pesquisa", "Permalink to this definition": "Link permanente para esta defini\u00e7\u00e3o", "Expand sidebar": "Expandir painel lateral", "Permalink to this headline": "Link permanente para este t\u00edtulo", "Collapse sidebar": "Recolher painel lateral"}}); \ No newline at end of file
diff --git a/sphinx/locale/pt_BR/LC_MESSAGES/sphinx.mo b/sphinx/locale/pt_BR/LC_MESSAGES/sphinx.mo
index 67c1ce54..3016d5ef 100644
--- a/sphinx/locale/pt_BR/LC_MESSAGES/sphinx.mo
+++ b/sphinx/locale/pt_BR/LC_MESSAGES/sphinx.mo
Binary files differ
diff --git a/sphinx/locale/pt_BR/LC_MESSAGES/sphinx.po b/sphinx/locale/pt_BR/LC_MESSAGES/sphinx.po
index 7df9013e..b41b5ad1 100644
--- a/sphinx/locale/pt_BR/LC_MESSAGES/sphinx.po
+++ b/sphinx/locale/pt_BR/LC_MESSAGES/sphinx.po
@@ -7,406 +7,401 @@ msgid ""
msgstr ""
"Project-Id-Version: Sphinx 0.5\n"
"Report-Msgid-Bugs-To: roger.demetrescu@gmail.com\n"
-"POT-Creation-Date: 2008-11-09 19:46+0100\n"
-"PO-Revision-Date: 2010-06-20 18:34-0300\n"
+"POT-Creation-Date: 2011-09-21 10:06+0200\n"
+"PO-Revision-Date: 2011-01-22 14:41+0100\n"
"Last-Translator: Roger Demetrescu <roger.demetrescu@gmail.com>\n"
"Language-Team: pt_BR <roger.demetrescu@gmail.com>\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"
+"Generated-By: Babel 0.9.6\n"
-#: sphinx/environment.py:106
-#: sphinx/writers/latex.py:184
-#: sphinx/writers/manpage.py:67
+#: sphinx/config.py:81
+#, fuzzy, python-format
+msgid "%s %s documentation"
+msgstr "%s %s documentação"
+
+#: sphinx/environment.py:119 sphinx/writers/latex.py:190
+#: sphinx/writers/manpage.py:67 sphinx/writers/texinfo.py:203
#, python-format
msgid "%B %d, %Y"
msgstr "%d/%m/%Y"
-#: sphinx/roles.py:174
+#: sphinx/environment.py:1625
+#, fuzzy, python-format
+msgid "see %s"
+msgstr "veja %s"
+
+#: sphinx/environment.py:1628
+#, fuzzy, python-format
+msgid "see also %s"
+msgstr "veja também %s"
+
+#: sphinx/roles.py:175
#, python-format
-msgid "Python Enhancement Proposals!PEP %s"
-msgstr "Python Enhancement Proposals!PEP %s"
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr "Python Enhancement Proposals; PEP %s"
-#: sphinx/builders/changes.py:72
+#: sphinx/builders/changes.py:73
msgid "Builtins"
msgstr "Internos"
-#: sphinx/builders/changes.py:74
+#: sphinx/builders/changes.py:75
msgid "Module level"
msgstr "Módulo"
-#: sphinx/builders/html.py:266
+#: sphinx/builders/html.py:274
#, python-format
msgid "%b %d, %Y"
msgstr "%d/%m/%Y"
-#: sphinx/builders/html.py:285
-#: sphinx/themes/basic/defindex.html:30
+#: sphinx/builders/html.py:293 sphinx/themes/basic/defindex.html:30
msgid "General Index"
msgstr "Índice Geral"
-#: sphinx/builders/html.py:285
+#: sphinx/builders/html.py:293
msgid "index"
msgstr "índice"
-#: sphinx/builders/html.py:345
+#: sphinx/builders/html.py:353
msgid "next"
msgstr "próximo"
-#: sphinx/builders/html.py:354
+#: sphinx/builders/html.py:362
msgid "previous"
msgstr "anterior"
-#: sphinx/builders/latex.py:151
+#: sphinx/builders/latex.py:141 sphinx/builders/texinfo.py:196
msgid " (in "
msgstr " (em "
-#: sphinx/directives/other.py:127
+#: sphinx/directives/other.py:136
msgid "Section author: "
msgstr "Autor da seção: "
-#: sphinx/directives/other.py:129
+#: sphinx/directives/other.py:138
msgid "Module author: "
msgstr "Autor do módulo: "
-#: sphinx/directives/other.py:131
+#: sphinx/directives/other.py:140
msgid "Code author: "
msgstr "Autor do código: "
-#: sphinx/directives/other.py:133
+#: sphinx/directives/other.py:142
msgid "Author: "
msgstr "Autor: "
-#: sphinx/directives/other.py:238
+#: sphinx/directives/other.py:215
msgid "See also"
msgstr "Veja também"
-#: sphinx/domains/__init__.py:253
+#: sphinx/domains/__init__.py:244
#, python-format
msgid "%s %s"
msgstr "%s %s"
-#: sphinx/domains/c.py:51
-#: sphinx/domains/python.py:49
+#: sphinx/domains/c.py:51 sphinx/domains/python.py:95
msgid "Parameters"
msgstr "Parâmetros"
-#: sphinx/domains/c.py:54
-#: sphinx/domains/javascript.py:137
-#: sphinx/domains/python.py:59
+#: sphinx/domains/c.py:54 sphinx/domains/javascript.py:128
+#: sphinx/domains/python.py:107
msgid "Returns"
msgstr "Retorna"
-#: sphinx/domains/c.py:56
-#: sphinx/domains/python.py:61
+#: sphinx/domains/c.py:56 sphinx/domains/python.py:109
msgid "Return type"
msgstr "Tipo de retorno"
-#: sphinx/domains/c.py:133
+#: sphinx/domains/c.py:141
#, python-format
msgid "%s (C function)"
msgstr "%s (função C)"
-#: sphinx/domains/c.py:135
+#: sphinx/domains/c.py:143
#, python-format
msgid "%s (C member)"
msgstr "%s (membro C)"
-#: sphinx/domains/c.py:137
+#: sphinx/domains/c.py:145
#, python-format
msgid "%s (C macro)"
msgstr "%s (macro C)"
-#: sphinx/domains/c.py:139
+#: sphinx/domains/c.py:147
#, python-format
msgid "%s (C type)"
msgstr "%s (tipo C)"
-#: sphinx/domains/c.py:141
+#: sphinx/domains/c.py:149
#, python-format
msgid "%s (C variable)"
msgstr "%s (variável C)"
-#: sphinx/domains/c.py:171
-#: sphinx/domains/cpp.py:1031
-#: sphinx/domains/javascript.py:166
-#: sphinx/domains/python.py:497
+#: sphinx/domains/c.py:204 sphinx/domains/cpp.py:1060
+#: sphinx/domains/javascript.py:162 sphinx/domains/python.py:559
msgid "function"
msgstr "função"
-#: sphinx/domains/c.py:172
-#: sphinx/domains/cpp.py:1032
+#: sphinx/domains/c.py:205 sphinx/domains/cpp.py:1061
msgid "member"
msgstr "membro"
-#: sphinx/domains/c.py:173
+#: sphinx/domains/c.py:206
msgid "macro"
msgstr "macro"
-#: sphinx/domains/c.py:174
-#: sphinx/domains/cpp.py:1033
+#: sphinx/domains/c.py:207 sphinx/domains/cpp.py:1062
msgid "type"
msgstr "tipo"
-#: sphinx/domains/c.py:175
+#: sphinx/domains/c.py:208
msgid "variable"
msgstr "variável"
-#: sphinx/domains/cpp.py:876
+#: sphinx/domains/cpp.py:904
#, python-format
msgid "%s (C++ class)"
msgstr "%s (classe C++)"
-#: sphinx/domains/cpp.py:891
+#: sphinx/domains/cpp.py:919
#, python-format
msgid "%s (C++ type)"
msgstr "%s (tipo C++)"
-#: sphinx/domains/cpp.py:910
+#: sphinx/domains/cpp.py:938
#, python-format
msgid "%s (C++ member)"
msgstr "%s (membro C++)"
-#: sphinx/domains/cpp.py:962
+#: sphinx/domains/cpp.py:990
#, python-format
msgid "%s (C++ function)"
msgstr "%s (função C++)"
-#: sphinx/domains/cpp.py:1030
-#: sphinx/domains/python.py:499
+#: sphinx/domains/cpp.py:1059 sphinx/domains/javascript.py:163
+#: sphinx/domains/python.py:561
msgid "class"
msgstr "classe"
-#: sphinx/domains/javascript.py:117
-#: sphinx/domains/python.py:221
+#: sphinx/domains/javascript.py:106 sphinx/domains/python.py:254
#, python-format
msgid "%s() (built-in function)"
msgstr "%s() (função interna)"
-#: sphinx/domains/javascript.py:118
-#: sphinx/domains/python.py:285
+#: sphinx/domains/javascript.py:107 sphinx/domains/python.py:318
#, python-format
msgid "%s() (%s method)"
msgstr "%s() (método %s)"
-#: sphinx/domains/javascript.py:120
+#: sphinx/domains/javascript.py:109
+#, python-format
+msgid "%s() (class)"
+msgstr "%s() (classe)"
+
+#: sphinx/domains/javascript.py:111
#, python-format
msgid "%s (global variable or constant)"
msgstr "%s (variável global ou constante)"
-#: sphinx/domains/javascript.py:122
-#: sphinx/domains/python.py:323
+#: sphinx/domains/javascript.py:113 sphinx/domains/python.py:356
#, python-format
msgid "%s (%s attribute)"
msgstr "%s (atributo %s)"
-#: sphinx/domains/javascript.py:131
+#: sphinx/domains/javascript.py:122
msgid "Arguments"
msgstr "Parâmetros"
-#: sphinx/domains/javascript.py:134
+#: sphinx/domains/javascript.py:125
msgid "Throws"
msgstr "Gera"
-#: sphinx/domains/javascript.py:167
-#: sphinx/domains/python.py:498
+#: sphinx/domains/javascript.py:164 sphinx/domains/python.py:560
msgid "data"
msgstr "dado"
-#: sphinx/domains/javascript.py:168
-#: sphinx/domains/python.py:504
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:566
msgid "attribute"
msgstr "atributo"
-#: sphinx/domains/python.py:53
+#: sphinx/domains/python.py:100
msgid "Variables"
msgstr "Variáveis"
-#: sphinx/domains/python.py:56
+#: sphinx/domains/python.py:104
msgid "Raises"
msgstr "Levanta"
-#: sphinx/domains/python.py:222
-#: sphinx/domains/python.py:279
-#: sphinx/domains/python.py:291
-#: sphinx/domains/python.py:304
+#: sphinx/domains/python.py:255 sphinx/domains/python.py:312
+#: sphinx/domains/python.py:324 sphinx/domains/python.py:337
#, python-format
msgid "%s() (in module %s)"
msgstr "%s() (no módulo %s)"
-#: sphinx/domains/python.py:225
+#: sphinx/domains/python.py:258
#, python-format
msgid "%s (built-in variable)"
msgstr "%s (variável interna)"
-#: sphinx/domains/python.py:226
-#: sphinx/domains/python.py:317
+#: sphinx/domains/python.py:259 sphinx/domains/python.py:350
#, python-format
msgid "%s (in module %s)"
msgstr "%s (no módulo %s)"
-#: sphinx/domains/python.py:242
+#: sphinx/domains/python.py:275
#, python-format
msgid "%s (built-in class)"
msgstr "%s (classe interna)"
-#: sphinx/domains/python.py:243
+#: sphinx/domains/python.py:276
#, python-format
msgid "%s (class in %s)"
msgstr "%s (classe em %s)"
-#: sphinx/domains/python.py:283
+#: sphinx/domains/python.py:316
#, python-format
msgid "%s() (%s.%s method)"
msgstr "%s() (método %s.%s)"
-#: sphinx/domains/python.py:295
+#: sphinx/domains/python.py:328
#, python-format
msgid "%s() (%s.%s static method)"
msgstr "%s() (método estático %s.%s)"
-#: sphinx/domains/python.py:298
+#: sphinx/domains/python.py:331
#, python-format
msgid "%s() (%s static method)"
msgstr "%s() (método estático %s)"
-#: sphinx/domains/python.py:308
+#: sphinx/domains/python.py:341
#, python-format
msgid "%s() (%s.%s class method)"
msgstr "%s() (método de classe %s.%s)"
-#: sphinx/domains/python.py:311
+#: sphinx/domains/python.py:344
#, python-format
msgid "%s() (%s class method)"
msgstr "%s() (método de classe %s)"
-#: sphinx/domains/python.py:321
+#: sphinx/domains/python.py:354
#, python-format
msgid "%s (%s.%s attribute)"
msgstr "%s (atributo %s.%s)"
-#: sphinx/domains/python.py:366
-msgid "Platforms: "
-msgstr "Plataformas: "
-
-#: sphinx/domains/python.py:372
+#: sphinx/domains/python.py:434
#, python-format
msgid "%s (module)"
msgstr "%s (módulo)"
-#: sphinx/domains/python.py:429
+#: sphinx/domains/python.py:491
msgid "Python Module Index"
msgstr "Índice de Módulos do Python"
-#: sphinx/domains/python.py:430
+#: sphinx/domains/python.py:492
msgid "modules"
msgstr "módulos"
-#: sphinx/domains/python.py:475
+#: sphinx/domains/python.py:537
msgid "Deprecated"
msgstr "Obsoleto"
-#: sphinx/domains/python.py:500
-#: sphinx/locale/__init__.py:162
+#: sphinx/domains/python.py:562 sphinx/locale/__init__.py:179
msgid "exception"
msgstr "exceção"
-#: sphinx/domains/python.py:501
+#: sphinx/domains/python.py:563
msgid "method"
msgstr "método"
-#: sphinx/domains/python.py:502
-#, python-format
+#: sphinx/domains/python.py:564
msgid "class method"
msgstr "método de classe"
-#: sphinx/domains/python.py:503
+#: sphinx/domains/python.py:565
msgid "static method"
msgstr "método estático"
-#: sphinx/domains/python.py:505
-#: sphinx/locale/__init__.py:158
+#: sphinx/domains/python.py:567 sphinx/locale/__init__.py:175
msgid "module"
msgstr "módulo"
-#: sphinx/domains/rst.py:53
+#: sphinx/domains/python.py:695
+msgid " (deprecated)"
+msgstr " (obsoleto)"
+
+#: sphinx/domains/rst.py:55
#, python-format
msgid "%s (directive)"
msgstr "%s (diretiva)"
-#: sphinx/domains/rst.py:55
+#: sphinx/domains/rst.py:57
#, python-format
msgid "%s (role)"
msgstr "%s (papel)"
-#: sphinx/domains/rst.py:103
+#: sphinx/domains/rst.py:106
msgid "directive"
msgstr "diretiva"
-#: sphinx/domains/rst.py:104
+#: sphinx/domains/rst.py:107
msgid "role"
msgstr "papel"
-#: sphinx/domains/std.py:68
-#: sphinx/domains/std.py:84
+#: sphinx/domains/std.py:70 sphinx/domains/std.py:86
#, python-format
msgid "environment variable; %s"
msgstr "váriavel de ambiente; %s"
-#: sphinx/domains/std.py:160
+#: sphinx/domains/std.py:162
#, python-format
msgid "%scommand line option; %s"
msgstr "%sopção de linha de comando; %s"
-#: sphinx/domains/std.py:328
+#: sphinx/domains/std.py:393
msgid "glossary term"
msgstr "Termo de glossário"
-#: sphinx/domains/std.py:329
+#: sphinx/domains/std.py:394
msgid "grammar token"
msgstr "token de gramática"
-#: sphinx/domains/std.py:330
+#: sphinx/domains/std.py:395
msgid "reference label"
msgstr "rótulo de referência"
-#: sphinx/domains/std.py:331
+#: sphinx/domains/std.py:396
msgid "environment variable"
msgstr "váriavel de ambiente"
-#: sphinx/domains/std.py:332
+#: sphinx/domains/std.py:397
msgid "program option"
msgstr "opção de programa"
-#: sphinx/domains/std.py:360
-#: sphinx/themes/basic/genindex-single.html:11
+#: sphinx/domains/std.py:427 sphinx/themes/basic/genindex-single.html:32
#: sphinx/themes/basic/genindex-split.html:11
#: sphinx/themes/basic/genindex-split.html:14
-#: sphinx/themes/basic/genindex.html:11
-#: sphinx/themes/basic/genindex.html:14
-#: sphinx/themes/basic/genindex.html:50
-#: sphinx/themes/basic/layout.html:125
-#: sphinx/writers/latex.py:173
+#: sphinx/themes/basic/genindex.html:32 sphinx/themes/basic/genindex.html:35
+#: sphinx/themes/basic/genindex.html:68 sphinx/themes/basic/layout.html:134
+#: sphinx/writers/latex.py:179 sphinx/writers/texinfo.py:456
msgid "Index"
msgstr "Índice"
-#: sphinx/domains/std.py:361
+#: sphinx/domains/std.py:428
msgid "Module Index"
msgstr "Índice do Módulo"
-#: sphinx/domains/std.py:362
-#: sphinx/themes/basic/defindex.html:25
+#: sphinx/domains/std.py:429 sphinx/themes/basic/defindex.html:25
msgid "Search Page"
msgstr "Página de Pesquisa"
-#: sphinx/ext/autodoc.py:917
+#: sphinx/ext/autodoc.py:1002
#, python-format
msgid " Bases: %s"
msgstr " Bases: %s"
-#: sphinx/ext/autodoc.py:950
+#: sphinx/ext/autodoc.py:1038
#, python-format
msgid "alias of :class:`%s`"
msgstr "apelido de :class:`%s`"
@@ -424,131 +419,125 @@ msgstr "(A <<entrada original>> está localizada em %s, linha %d.)"
msgid "original entry"
msgstr "entrada original"
-#: sphinx/ext/viewcode.py:66
+#: sphinx/ext/viewcode.py:70
msgid "[source]"
msgstr "[código fonte]"
-#: sphinx/ext/viewcode.py:109
+#: sphinx/ext/viewcode.py:117
msgid "[docs]"
msgstr "[documentos]"
-#: sphinx/ext/viewcode.py:123
+#: sphinx/ext/viewcode.py:131
msgid "Module code"
msgstr "Código do módulo"
-#: sphinx/ext/viewcode.py:129
+#: sphinx/ext/viewcode.py:137
#, python-format
msgid "<h1>Source code for %s</h1>"
msgstr "<h1>Código fonte de %s</h1>"
-#: sphinx/ext/viewcode.py:156
+#: sphinx/ext/viewcode.py:164
msgid "Overview: module code"
msgstr "Visão geral: código do módulo"
-#: sphinx/ext/viewcode.py:157
+#: sphinx/ext/viewcode.py:165
msgid "<h1>All modules for which code is available</h1>"
msgstr "<h1>Todos os módulos onde este código está disponível</h1>"
-#: sphinx/locale/__init__.py:139
+#: sphinx/locale/__init__.py:155
msgid "Attention"
msgstr "Atenção"
-#: sphinx/locale/__init__.py:140
+#: sphinx/locale/__init__.py:156
msgid "Caution"
msgstr "Cuidado"
-#: sphinx/locale/__init__.py:141
+#: sphinx/locale/__init__.py:157
msgid "Danger"
msgstr "Perigo"
-#: sphinx/locale/__init__.py:142
+#: sphinx/locale/__init__.py:158
msgid "Error"
msgstr "Erro"
-#: sphinx/locale/__init__.py:143
+#: sphinx/locale/__init__.py:159
msgid "Hint"
msgstr "Dica"
-#: sphinx/locale/__init__.py:144
+#: sphinx/locale/__init__.py:160
msgid "Important"
msgstr "Importante"
-#: sphinx/locale/__init__.py:145
+#: sphinx/locale/__init__.py:161
msgid "Note"
msgstr "Nota"
-#: sphinx/locale/__init__.py:146
+#: sphinx/locale/__init__.py:162
msgid "See Also"
msgstr "Veja Também"
-#: sphinx/locale/__init__.py:147
+#: sphinx/locale/__init__.py:163
msgid "Tip"
msgstr "Dica"
-#: sphinx/locale/__init__.py:148
+#: sphinx/locale/__init__.py:164
msgid "Warning"
msgstr "Aviso"
-#: sphinx/locale/__init__.py:152
+#: sphinx/locale/__init__.py:168
#, python-format
msgid "New in version %s"
msgstr "Novo na versão %s"
-#: sphinx/locale/__init__.py:153
+#: sphinx/locale/__init__.py:169
#, python-format
msgid "Changed in version %s"
msgstr "Alterado na versão %s"
-#: sphinx/locale/__init__.py:154
+#: sphinx/locale/__init__.py:170
#, python-format
msgid "Deprecated since version %s"
msgstr "Obsoleto desde a versão %s"
-#: sphinx/locale/__init__.py:159
+#: sphinx/locale/__init__.py:176
msgid "keyword"
msgstr "palavra-chave"
-#: sphinx/locale/__init__.py:160
+#: sphinx/locale/__init__.py:177
msgid "operator"
msgstr "operador"
-#: sphinx/locale/__init__.py:161
+#: sphinx/locale/__init__.py:178
msgid "object"
msgstr "objeto"
-#: sphinx/locale/__init__.py:163
+#: sphinx/locale/__init__.py:180
msgid "statement"
msgstr "comando"
-#: sphinx/locale/__init__.py:164
+#: sphinx/locale/__init__.py:181
msgid "built-in function"
msgstr "função interna"
-#: sphinx/themes/agogo/layout.html:45
-#: sphinx/themes/basic/globaltoc.html:10
+#: sphinx/themes/agogo/layout.html:45 sphinx/themes/basic/globaltoc.html:10
#: sphinx/themes/basic/localtoc.html:11
msgid "Table Of Contents"
msgstr "Tabela de Conteúdo"
-#: sphinx/themes/agogo/layout.html:49
-#: sphinx/themes/basic/layout.html:128
-#: sphinx/themes/basic/search.html:11
-#: sphinx/themes/basic/search.html:14
+#: sphinx/themes/agogo/layout.html:49 sphinx/themes/basic/layout.html:137
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:20
msgid "Search"
msgstr "Pesquisar"
-#: sphinx/themes/agogo/layout.html:52
-#: sphinx/themes/basic/searchbox.html:15
+#: sphinx/themes/agogo/layout.html:52 sphinx/themes/basic/searchbox.html:15
msgid "Go"
msgstr "Ir"
-#: sphinx/themes/agogo/layout.html:57
-#: sphinx/themes/basic/searchbox.html:20
+#: sphinx/themes/agogo/layout.html:57 sphinx/themes/basic/searchbox.html:20
msgid "Enter search terms or a module, class or function name."
msgstr "Digite os termos da busca ou o nome de um módulo, classe ou função."
-#: sphinx/themes/agogo/layout.html:78
-#: sphinx/themes/basic/sourcelink.html:14
+#: sphinx/themes/agogo/layout.html:78 sphinx/themes/basic/sourcelink.html:14
msgid "Show Source"
msgstr "Exibir Fonte"
@@ -584,15 +573,15 @@ msgstr "acesso rápido para todos os módulos"
msgid "all functions, classes, terms"
msgstr "todas funções, classes, termos"
-#: sphinx/themes/basic/genindex-single.html:14
+#: sphinx/themes/basic/genindex-single.html:35
#, python-format
msgid "Index &ndash; %(key)s"
msgstr "Índice &ndash; %(key)s"
-#: sphinx/themes/basic/genindex-single.html:46
+#: sphinx/themes/basic/genindex-single.html:63
#: sphinx/themes/basic/genindex-split.html:24
#: sphinx/themes/basic/genindex-split.html:38
-#: sphinx/themes/basic/genindex.html:56
+#: sphinx/themes/basic/genindex.html:74
msgid "Full index on one page"
msgstr "Índice completo em uma página"
@@ -604,42 +593,46 @@ msgstr "Paginas de índice por letra"
msgid "can be huge"
msgstr "pode ser enorme"
-#: sphinx/themes/basic/layout.html:23
+#: sphinx/themes/basic/layout.html:29
msgid "Navigation"
msgstr "Navegação"
-#: sphinx/themes/basic/layout.html:113
+#: sphinx/themes/basic/layout.html:122
#, python-format
msgid "Search within %(docstitle)s"
msgstr "Pesquisar dentro de %(docstitle)s"
-#: sphinx/themes/basic/layout.html:122
+#: sphinx/themes/basic/layout.html:131
msgid "About these documents"
msgstr "Sobre estes documentos"
-#: sphinx/themes/basic/layout.html:131
+#: sphinx/themes/basic/layout.html:140
msgid "Copyright"
msgstr "Copyright"
-#: sphinx/themes/basic/layout.html:180
+#: sphinx/themes/basic/layout.html:189
#, python-format
msgid "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
msgstr "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
-#: sphinx/themes/basic/layout.html:182
+#: sphinx/themes/basic/layout.html:191
#, python-format
msgid "&copy; Copyright %(copyright)s."
msgstr "&copy; Copyright %(copyright)s."
-#: sphinx/themes/basic/layout.html:186
+#: sphinx/themes/basic/layout.html:195
#, python-format
msgid "Last updated on %(last_updated)s."
msgstr "Última atualização em %(last_updated)s."
-#: sphinx/themes/basic/layout.html:189
+#: sphinx/themes/basic/layout.html:198
#, python-format
-msgid "Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> %(sphinx_version)s."
-msgstr "Criado com <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> %(sphinx_version)s."
+msgid ""
+"Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+"Criado com <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
+"%(sphinx_version)s."
#: sphinx/themes/basic/opensearch.xml:4
#, python-format
@@ -662,13 +655,13 @@ msgstr "Próximo tópico"
msgid "next chapter"
msgstr "próximo capítulo"
-#: sphinx/themes/basic/search.html:18
+#: sphinx/themes/basic/search.html:24
msgid ""
"Please activate JavaScript to enable the search\n"
" functionality."
msgstr "Por favor ative o JavaScript para habilitar a funcionalidade de pesquisa."
-#: sphinx/themes/basic/search.html:23
+#: sphinx/themes/basic/search.html:29
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"
@@ -676,20 +669,21 @@ msgid ""
" containing fewer words won't appear in the result list."
msgstr ""
"A partir daqui você pode pesquisar estes documentos. Preencha suas \n"
-" palavras de pesquisa na caixa abaixo e clique em \"pesquisar\". Observe que a função de pesquisa\n"
+" palavras de pesquisa na caixa abaixo e clique em \"pesquisar\". "
+"Observe que a função de pesquisa\n"
" irá pesquisar automaticamente por todas as palavras.\n"
-" Páginas contendo menos palavras não irão aparecer na lista de resultado."
+" Páginas contendo menos palavras não irão aparecer na lista de "
+"resultado."
-#: sphinx/themes/basic/search.html:30
+#: sphinx/themes/basic/search.html:36
msgid "search"
msgstr "pesquisar"
-#: sphinx/themes/basic/search.html:34
-#: sphinx/themes/basic/static/searchtools.js:489
+#: sphinx/themes/basic/search.html:40
msgid "Search Results"
msgstr "Resultados da Pesquisa"
-#: sphinx/themes/basic/search.html:36
+#: sphinx/themes/basic/search.html:42
msgid "Your search did not match any results."
msgstr "Sua pesquisa não encontrou nenhum resultado."
@@ -729,14 +723,12 @@ msgstr "Alterações na API C"
msgid "Other changes"
msgstr "Outras alterações"
-#: sphinx/themes/basic/static/doctools.js:154
-#: sphinx/writers/html.py:482
-#: sphinx/writers/html.py:487
+#: sphinx/themes/basic/static/doctools.js:154 sphinx/writers/html.py:504
+#: sphinx/writers/html.py:510
msgid "Permalink to this headline"
msgstr "Link permanente para este título"
-#: sphinx/themes/basic/static/doctools.js:160
-#: sphinx/writers/html.py:87
+#: sphinx/themes/basic/static/doctools.js:160 sphinx/writers/html.py:92
msgid "Permalink to this definition"
msgstr "Link permanente para esta definição"
@@ -744,33 +736,12 @@ msgstr "Link permanente para esta definição"
msgid "Hide Search Matches"
msgstr "Esconder Resultados da Pesquisa"
-#: sphinx/themes/basic/static/searchtools.js:285
-msgid "Searching"
-msgstr "Pesquisando"
-
-#: sphinx/themes/basic/static/searchtools.js:290
-msgid "Preparing search..."
-msgstr "Preparando pesquisa..."
-
-#: sphinx/themes/basic/static/searchtools.js:364
-msgid ", in "
-msgstr ", em "
-
-#: sphinx/themes/basic/static/searchtools.js:491
-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 "Sua pesquisa não encontrou nenhum documento. Por favor assegure-se de que todas as palavras foram digitadas corretamente e de que você tenha selecionado o mínimo de categorias."
-
-#: sphinx/themes/basic/static/searchtools.js:493
-#, python-format
-msgid "Search finished, found %s page(s) matching the search query."
-msgstr "Pesquisa finalizada, foram encontrada(s) %s página(s) que conferem com o critério de pesquisa."
-
-#: sphinx/themes/default/static/sidebar.js:66
+#: sphinx/themes/default/static/sidebar.js:69
msgid "Expand sidebar"
msgstr "Expandir painel lateral"
-#: sphinx/themes/default/static/sidebar.js:79
-#: sphinx/themes/default/static/sidebar.js:106
+#: sphinx/themes/default/static/sidebar.js:82
+#: sphinx/themes/default/static/sidebar.js:110
msgid "Collapse sidebar"
msgstr "Recolher painel lateral"
@@ -778,24 +749,24 @@ msgstr "Recolher painel lateral"
msgid "Contents"
msgstr "Conteúdo"
-#: sphinx/writers/latex.py:171
+#: sphinx/writers/latex.py:177
msgid "Release"
msgstr "Versão"
-#: sphinx/writers/latex.py:572
-#: sphinx/writers/manpage.py:178
+#: sphinx/writers/latex.py:594 sphinx/writers/manpage.py:182
+#: sphinx/writers/texinfo.py:589
msgid "Footnotes"
msgstr "Notas de rodapé"
-#: sphinx/writers/latex.py:641
+#: sphinx/writers/latex.py:676
msgid "continued from previous page"
msgstr "continuação da página anterior"
-#: sphinx/writers/latex.py:646
+#: sphinx/writers/latex.py:681
msgid "Continued on next page"
msgstr "Continua na próxima página"
-#: sphinx/writers/text.py:422
+#: sphinx/writers/text.py:437
msgid "[image]"
msgstr "[imagem]"
diff --git a/sphinx/locale/ru/LC_MESSAGES/sphinx.js b/sphinx/locale/ru/LC_MESSAGES/sphinx.js
index e597cfad..ca0376ac 100644
--- a/sphinx/locale/ru/LC_MESSAGES/sphinx.js
+++ b/sphinx/locale/ru/LC_MESSAGES/sphinx.js
@@ -1 +1 @@
-Documentation.addTranslations({"locale": "ru", "plural_expr": "n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2", "messages": {"Search Results": "\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043f\u043e\u0438\u0441\u043a\u0430", "Preparing search...": "\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u043a \u043f\u043e\u0438\u0441\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.": "\u041d\u0435\u0442 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0432\u0430\u0448\u0435\u043c\u0443 \u0437\u0430\u043f\u0440\u043e\u0441\u0443. \u041f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435, \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u043b\u0438 \u0432\u044b\u0431\u0440\u0430\u043d\u044b \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u0438 \u043d\u0435\u0442 \u043b\u0438 \u043e\u043f\u0435\u0447\u0430\u0442\u043e\u043a \u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u0435.", "Search finished, found %s page(s) matching the search query.": "\u041f\u043e\u0438\u0441\u043a \u043e\u043a\u043e\u043d\u0447\u0435\u043d, \u043d\u0430\u0439\u0434\u0435\u043d\u043e \u0441\u0442\u0440\u0430\u043d\u0438\u0446: %s.", ", in ": ", \u0432 ", "Expand sidebar": "", "Permalink to this headline": "\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u044d\u0442\u043e\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a", "Searching": "\u041f\u043e\u0438\u0441\u043a", "Collapse sidebar": "", "Permalink to this definition": "\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u044d\u0442\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435", "Hide Search Matches": "\u0421\u043d\u044f\u0442\u044c \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435"}}); \ No newline at end of file
+Documentation.addTranslations({"locale": "ru", "plural_expr": "n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2", "messages": {"Hide Search Matches": "\u0421\u043d\u044f\u0442\u044c \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435", "Permalink to this definition": "\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u044d\u0442\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435", "Expand sidebar": "", "Permalink to this headline": "\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u044d\u0442\u043e\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a", "Collapse sidebar": ""}}); \ No newline at end of file
diff --git a/sphinx/locale/ru/LC_MESSAGES/sphinx.mo b/sphinx/locale/ru/LC_MESSAGES/sphinx.mo
index ecdc6860..593350d3 100644
--- a/sphinx/locale/ru/LC_MESSAGES/sphinx.mo
+++ b/sphinx/locale/ru/LC_MESSAGES/sphinx.mo
Binary files differ
diff --git a/sphinx/locale/ru/LC_MESSAGES/sphinx.po b/sphinx/locale/ru/LC_MESSAGES/sphinx.po
index e2b1e3a1..b6374d81 100644
--- a/sphinx/locale/ru/LC_MESSAGES/sphinx.po
+++ b/sphinx/locale/ru/LC_MESSAGES/sphinx.po
@@ -6,8 +6,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Sphinx 0.6b1\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2009-01-24 18:39+0000\n"
-"PO-Revision-Date: 2010-05-24 23:54+0200\n"
+"POT-Creation-Date: 2011-09-21 10:06+0200\n"
+"PO-Revision-Date: 2011-09-21 10:14+0200\n"
"Last-Translator: alexander smishlajev <alex@tycobka.lv>\n"
"Language-Team: ru <LL@li.org>\n"
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
@@ -15,379 +15,399 @@ msgstr ""
"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"
+"Generated-By: Babel 0.9.6\n"
-#: sphinx/environment.py:106 sphinx/writers/latex.py:184
-#: sphinx/writers/manpage.py:67
+#: sphinx/config.py:81
+#, python-format
+msgid "%s %s documentation"
+msgstr ""
+
+#: sphinx/environment.py:119 sphinx/writers/latex.py:190
+#: sphinx/writers/manpage.py:67 sphinx/writers/texinfo.py:203
#, python-format
msgid "%B %d, %Y"
msgstr "%d %B %Y"
-#: sphinx/roles.py:174
+#: sphinx/environment.py:1625
#, python-format
-msgid "Python Enhancement Proposals!PEP %s"
-msgstr "Python Enhancement Proposals!PEP %s"
+msgid "see %s"
+msgstr ""
+
+#: sphinx/environment.py:1628
+#, python-format
+msgid "see also %s"
+msgstr ""
-#: sphinx/builders/changes.py:72
+#: sphinx/roles.py:175
+#, fuzzy, python-format
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr "Python Enhancement Proposals; PEP %s"
+
+#: sphinx/builders/changes.py:73
msgid "Builtins"
msgstr "Встроенные функции"
-#: sphinx/builders/changes.py:74
+#: sphinx/builders/changes.py:75
msgid "Module level"
msgstr "Модуль"
-#: sphinx/builders/html.py:266
+#: sphinx/builders/html.py:274
#, python-format
msgid "%b %d, %Y"
msgstr "%d %b %Y"
-#: sphinx/builders/html.py:285 sphinx/themes/basic/defindex.html:30
+#: sphinx/builders/html.py:293 sphinx/themes/basic/defindex.html:30
msgid "General Index"
msgstr "Словарь-указатель"
-#: sphinx/builders/html.py:285
+#: sphinx/builders/html.py:293
msgid "index"
msgstr "словарь"
-#: sphinx/builders/html.py:345
+#: sphinx/builders/html.py:353
msgid "next"
msgstr "следующий"
-#: sphinx/builders/html.py:354
+#: sphinx/builders/html.py:362
msgid "previous"
msgstr "предыдущий"
-#: sphinx/builders/latex.py:151
+#: sphinx/builders/latex.py:141 sphinx/builders/texinfo.py:196
msgid " (in "
msgstr " (в "
-#: sphinx/directives/other.py:127
+#: sphinx/directives/other.py:136
msgid "Section author: "
msgstr "Автор секции: "
-#: sphinx/directives/other.py:129
+#: sphinx/directives/other.py:138
msgid "Module author: "
msgstr "Автор модуля: "
-#: sphinx/directives/other.py:131
+#: sphinx/directives/other.py:140
#, fuzzy
msgid "Code author: "
msgstr "Автор модуля: "
-#: sphinx/directives/other.py:133
+#: sphinx/directives/other.py:142
msgid "Author: "
msgstr "Автор: "
-#: sphinx/directives/other.py:238
+#: sphinx/directives/other.py:215
msgid "See also"
msgstr "См.также"
-#: sphinx/domains/__init__.py:253
+#: sphinx/domains/__init__.py:244
#, python-format
msgid "%s %s"
msgstr ""
-#: sphinx/domains/c.py:51 sphinx/domains/python.py:49
+#: sphinx/domains/c.py:51 sphinx/domains/python.py:95
msgid "Parameters"
msgstr "Параметры"
-#: sphinx/domains/c.py:54 sphinx/domains/javascript.py:137
-#: sphinx/domains/python.py:59
+#: sphinx/domains/c.py:54 sphinx/domains/javascript.py:128
+#: sphinx/domains/python.py:107
msgid "Returns"
msgstr "Результат"
-#: sphinx/domains/c.py:56 sphinx/domains/python.py:61
+#: sphinx/domains/c.py:56 sphinx/domains/python.py:109
msgid "Return type"
msgstr "Тип результата"
-#: sphinx/domains/c.py:133
+#: sphinx/domains/c.py:141
#, python-format
msgid "%s (C function)"
msgstr "%s (функция C)"
-#: sphinx/domains/c.py:135
+#: sphinx/domains/c.py:143
#, python-format
msgid "%s (C member)"
msgstr "%s (поле C)"
-#: sphinx/domains/c.py:137
+#: sphinx/domains/c.py:145
#, python-format
msgid "%s (C macro)"
msgstr "%s (макроподстановка C)"
-#: sphinx/domains/c.py:139
+#: sphinx/domains/c.py:147
#, python-format
msgid "%s (C type)"
msgstr "%s (тип C)"
-#: sphinx/domains/c.py:141
+#: sphinx/domains/c.py:149
#, python-format
msgid "%s (C variable)"
msgstr "%s (переменная C)"
-#: sphinx/domains/c.py:171 sphinx/domains/cpp.py:1031
-#: sphinx/domains/javascript.py:166 sphinx/domains/python.py:497
+#: sphinx/domains/c.py:204 sphinx/domains/cpp.py:1060
+#: sphinx/domains/javascript.py:162 sphinx/domains/python.py:559
msgid "function"
msgstr "функция"
-#: sphinx/domains/c.py:172 sphinx/domains/cpp.py:1032
+#: sphinx/domains/c.py:205 sphinx/domains/cpp.py:1061
msgid "member"
msgstr "поле"
-#: sphinx/domains/c.py:173
+#: sphinx/domains/c.py:206
msgid "macro"
msgstr ""
-#: sphinx/domains/c.py:174 sphinx/domains/cpp.py:1033
+#: sphinx/domains/c.py:207 sphinx/domains/cpp.py:1062
msgid "type"
msgstr "тип"
-#: sphinx/domains/c.py:175
+#: sphinx/domains/c.py:208
#, fuzzy
msgid "variable"
msgstr "Переменная"
-#: sphinx/domains/cpp.py:876
+#: sphinx/domains/cpp.py:904
#, python-format
msgid "%s (C++ class)"
msgstr "%s (класс C++)"
-#: sphinx/domains/cpp.py:891
+#: sphinx/domains/cpp.py:919
#, python-format
msgid "%s (C++ type)"
msgstr "%s (тип C++)"
-#: sphinx/domains/cpp.py:910
+#: sphinx/domains/cpp.py:938
#, python-format
msgid "%s (C++ member)"
msgstr "%s (поле C++)"
-#: sphinx/domains/cpp.py:962
+#: sphinx/domains/cpp.py:990
#, python-format
msgid "%s (C++ function)"
msgstr "%s (функция C++)"
-#: sphinx/domains/cpp.py:1030 sphinx/domains/python.py:499
+#: sphinx/domains/cpp.py:1059 sphinx/domains/javascript.py:163
+#: sphinx/domains/python.py:561
msgid "class"
msgstr "класс"
-#: sphinx/domains/javascript.py:117 sphinx/domains/python.py:221
+#: sphinx/domains/javascript.py:106 sphinx/domains/python.py:254
#, python-format
msgid "%s() (built-in function)"
msgstr "%s() (встроенная функция)"
-#: sphinx/domains/javascript.py:118 sphinx/domains/python.py:285
+#: sphinx/domains/javascript.py:107 sphinx/domains/python.py:318
#, python-format
msgid "%s() (%s method)"
msgstr "%s() (метод %s)"
-#: sphinx/domains/javascript.py:120
+#: sphinx/domains/javascript.py:109
+#, python-format
+msgid "%s() (class)"
+msgstr "%s() (класс)"
+
+#: sphinx/domains/javascript.py:111
#, python-format
msgid "%s (global variable or constant)"
msgstr ""
-#: sphinx/domains/javascript.py:122 sphinx/domains/python.py:323
+#: sphinx/domains/javascript.py:113 sphinx/domains/python.py:356
#, python-format
msgid "%s (%s attribute)"
msgstr "%s (атрибут %s)"
-#: sphinx/domains/javascript.py:131
+#: sphinx/domains/javascript.py:122
#, fuzzy
msgid "Arguments"
msgstr "Параметры"
-#: sphinx/domains/javascript.py:134
+#: sphinx/domains/javascript.py:125
msgid "Throws"
msgstr ""
-#: sphinx/domains/javascript.py:167 sphinx/domains/python.py:498
+#: sphinx/domains/javascript.py:164 sphinx/domains/python.py:560
msgid "data"
msgstr ""
-#: sphinx/domains/javascript.py:168 sphinx/domains/python.py:504
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:566
msgid "attribute"
msgstr "атрибут"
-#: sphinx/domains/python.py:53
+#: sphinx/domains/python.py:100
#, fuzzy
msgid "Variables"
msgstr "Переменная"
-#: sphinx/domains/python.py:56
+#: sphinx/domains/python.py:104
msgid "Raises"
msgstr "Исключение"
-#: sphinx/domains/python.py:222 sphinx/domains/python.py:279
-#: sphinx/domains/python.py:291 sphinx/domains/python.py:304
+#: sphinx/domains/python.py:255 sphinx/domains/python.py:312
+#: sphinx/domains/python.py:324 sphinx/domains/python.py:337
#, python-format
msgid "%s() (in module %s)"
msgstr "%s() (в модуле %s)"
-#: sphinx/domains/python.py:225
+#: sphinx/domains/python.py:258
#, python-format
msgid "%s (built-in variable)"
msgstr "%s (встроенная переменная)"
-#: sphinx/domains/python.py:226 sphinx/domains/python.py:317
+#: sphinx/domains/python.py:259 sphinx/domains/python.py:350
#, python-format
msgid "%s (in module %s)"
msgstr "%s (в модуле %s)"
-#: sphinx/domains/python.py:242
+#: sphinx/domains/python.py:275
#, python-format
msgid "%s (built-in class)"
msgstr "%s (встроенный класс)"
-#: sphinx/domains/python.py:243
+#: sphinx/domains/python.py:276
#, python-format
msgid "%s (class in %s)"
msgstr "%s (класс в %s)"
-#: sphinx/domains/python.py:283
+#: sphinx/domains/python.py:316
#, python-format
msgid "%s() (%s.%s method)"
msgstr "%s() (метод %s.%s)"
-#: sphinx/domains/python.py:295
+#: sphinx/domains/python.py:328
#, python-format
msgid "%s() (%s.%s static method)"
msgstr "%s() (статический метод %s.%s)"
-#: sphinx/domains/python.py:298
+#: sphinx/domains/python.py:331
#, python-format
msgid "%s() (%s static method)"
msgstr "%s() (статический метод %s)"
-#: sphinx/domains/python.py:308
+#: sphinx/domains/python.py:341
#, fuzzy, python-format
msgid "%s() (%s.%s class method)"
msgstr "%s() (метод %s.%s)"
-#: sphinx/domains/python.py:311
+#: sphinx/domains/python.py:344
#, fuzzy, python-format
msgid "%s() (%s class method)"
msgstr "%s() (метод %s)"
-#: sphinx/domains/python.py:321
+#: sphinx/domains/python.py:354
#, python-format
msgid "%s (%s.%s attribute)"
msgstr "%s (атрибут %s.%s)"
-#: sphinx/domains/python.py:366
-msgid "Platforms: "
-msgstr "Платформы: "
-
-#: sphinx/domains/python.py:372
+#: sphinx/domains/python.py:434
#, python-format
msgid "%s (module)"
msgstr "%s (модуль)"
-#: sphinx/domains/python.py:429
+#: sphinx/domains/python.py:491
#, fuzzy
msgid "Python Module Index"
msgstr "Состав модуля"
-#: sphinx/domains/python.py:430
+#: sphinx/domains/python.py:492
msgid "modules"
msgstr "модули"
-#: sphinx/domains/python.py:475
+#: sphinx/domains/python.py:537
msgid "Deprecated"
msgstr "Не рекомендуется"
-#: sphinx/domains/python.py:500 sphinx/locale/__init__.py:162
+#: sphinx/domains/python.py:562 sphinx/locale/__init__.py:179
msgid "exception"
msgstr "исключение"
-#: sphinx/domains/python.py:501
+#: sphinx/domains/python.py:563
msgid "method"
msgstr ""
-#: sphinx/domains/python.py:502
-#, fuzzy, python-format
+#: sphinx/domains/python.py:564
msgid "class method"
-msgstr "%s() (метод %s)"
+msgstr ""
-#: sphinx/domains/python.py:503
+#: sphinx/domains/python.py:565
msgid "static method"
msgstr "статический метод"
-#: sphinx/domains/python.py:505 sphinx/locale/__init__.py:158
+#: sphinx/domains/python.py:567 sphinx/locale/__init__.py:175
msgid "module"
msgstr "модуль"
-#: sphinx/domains/rst.py:53
+#: sphinx/domains/python.py:695
+#, fuzzy
+msgid " (deprecated)"
+msgstr " (не рекомендуется)"
+
+#: sphinx/domains/rst.py:55
#, python-format
msgid "%s (directive)"
msgstr ""
-#: sphinx/domains/rst.py:55
-#, fuzzy, python-format
+#: sphinx/domains/rst.py:57
+#, python-format
msgid "%s (role)"
-msgstr "%s (модуль)"
+msgstr ""
-#: sphinx/domains/rst.py:103
+#: sphinx/domains/rst.py:106
msgid "directive"
msgstr ""
-#: sphinx/domains/rst.py:104
-#, fuzzy
+#: sphinx/domains/rst.py:107
msgid "role"
-msgstr "модуль"
+msgstr ""
-#: sphinx/domains/std.py:68 sphinx/domains/std.py:84
+#: sphinx/domains/std.py:70 sphinx/domains/std.py:86
#, python-format
msgid "environment variable; %s"
msgstr "переменная окружения; %s"
-#: sphinx/domains/std.py:160
+#: sphinx/domains/std.py:162
#, python-format
msgid "%scommand line option; %s"
msgstr "Опция командной строки %s; %s"
-#: sphinx/domains/std.py:328
+#: sphinx/domains/std.py:393
msgid "glossary term"
msgstr ""
-#: sphinx/domains/std.py:329
+#: sphinx/domains/std.py:394
msgid "grammar token"
msgstr ""
-#: sphinx/domains/std.py:330
+#: sphinx/domains/std.py:395
msgid "reference label"
msgstr ""
-#: sphinx/domains/std.py:331
+#: sphinx/domains/std.py:396
msgid "environment variable"
msgstr "переменная окружения"
-#: sphinx/domains/std.py:332
+#: sphinx/domains/std.py:397
msgid "program option"
msgstr ""
-#: sphinx/domains/std.py:360 sphinx/themes/basic/genindex-single.html:11
+#: sphinx/domains/std.py:427 sphinx/themes/basic/genindex-single.html:32
#: sphinx/themes/basic/genindex-split.html:11
#: sphinx/themes/basic/genindex-split.html:14
-#: sphinx/themes/basic/genindex.html:11 sphinx/themes/basic/genindex.html:14
-#: sphinx/themes/basic/genindex.html:50 sphinx/themes/basic/layout.html:125
-#: sphinx/writers/latex.py:173
+#: sphinx/themes/basic/genindex.html:32 sphinx/themes/basic/genindex.html:35
+#: sphinx/themes/basic/genindex.html:68 sphinx/themes/basic/layout.html:134
+#: sphinx/writers/latex.py:179 sphinx/writers/texinfo.py:456
msgid "Index"
msgstr "Алфавитный указатель"
-#: sphinx/domains/std.py:361
+#: sphinx/domains/std.py:428
msgid "Module Index"
msgstr "Состав модуля"
-#: sphinx/domains/std.py:362 sphinx/themes/basic/defindex.html:25
+#: sphinx/domains/std.py:429 sphinx/themes/basic/defindex.html:25
msgid "Search Page"
msgstr "Поиск"
-#: sphinx/ext/autodoc.py:917
+#: sphinx/ext/autodoc.py:1002
#, python-format
msgid " Bases: %s"
msgstr " Базовые классы: %s"
-#: sphinx/ext/autodoc.py:950
+#: sphinx/ext/autodoc.py:1038
#, python-format
msgid "alias of :class:`%s`"
msgstr "псевдоним класса :class:`%s`"
@@ -399,110 +419,110 @@ msgstr "План"
#: sphinx/ext/todo.py:109
#, fuzzy, python-format
msgid "(The <<original entry>> is located in %s, line %d.)"
-msgstr "(Исходный элемент находится в %s, в строке %d, и может быть найден "
+msgstr "(Исходный элемент находится в %s, в строке %d.)"
#: sphinx/ext/todo.py:117
msgid "original entry"
msgstr ""
-#: sphinx/ext/viewcode.py:66
+#: sphinx/ext/viewcode.py:70
msgid "[source]"
msgstr ""
-#: sphinx/ext/viewcode.py:109
+#: sphinx/ext/viewcode.py:117
msgid "[docs]"
msgstr ""
-#: sphinx/ext/viewcode.py:123
+#: sphinx/ext/viewcode.py:131
#, fuzzy
msgid "Module code"
msgstr "модуль"
-#: sphinx/ext/viewcode.py:129
+#: sphinx/ext/viewcode.py:137
#, python-format
msgid "<h1>Source code for %s</h1>"
msgstr ""
-#: sphinx/ext/viewcode.py:156
+#: sphinx/ext/viewcode.py:164
msgid "Overview: module code"
msgstr ""
-#: sphinx/ext/viewcode.py:157
+#: sphinx/ext/viewcode.py:165
msgid "<h1>All modules for which code is available</h1>"
msgstr ""
-#: sphinx/locale/__init__.py:139
+#: sphinx/locale/__init__.py:155
msgid "Attention"
msgstr "Внимание"
-#: sphinx/locale/__init__.py:140
+#: sphinx/locale/__init__.py:156
msgid "Caution"
msgstr "Осторожно"
-#: sphinx/locale/__init__.py:141
+#: sphinx/locale/__init__.py:157
msgid "Danger"
msgstr "Опасно"
-#: sphinx/locale/__init__.py:142
+#: sphinx/locale/__init__.py:158
msgid "Error"
msgstr "Ошибка"
-#: sphinx/locale/__init__.py:143
+#: sphinx/locale/__init__.py:159
msgid "Hint"
msgstr "Подсказка"
-#: sphinx/locale/__init__.py:144
+#: sphinx/locale/__init__.py:160
msgid "Important"
msgstr "Важно"
-#: sphinx/locale/__init__.py:145
+#: sphinx/locale/__init__.py:161
msgid "Note"
msgstr "Примечание"
-#: sphinx/locale/__init__.py:146
+#: sphinx/locale/__init__.py:162
msgid "See Also"
msgstr "См.также"
-#: sphinx/locale/__init__.py:147
+#: sphinx/locale/__init__.py:163
msgid "Tip"
msgstr "Совет"
-#: sphinx/locale/__init__.py:148
+#: sphinx/locale/__init__.py:164
msgid "Warning"
msgstr "Предупреждение"
-#: sphinx/locale/__init__.py:152
+#: sphinx/locale/__init__.py:168
#, python-format
msgid "New in version %s"
msgstr "Добавлено в версии %s"
-#: sphinx/locale/__init__.py:153
+#: sphinx/locale/__init__.py:169
#, python-format
msgid "Changed in version %s"
msgstr "Изменено в версии %s"
-#: sphinx/locale/__init__.py:154
+#: sphinx/locale/__init__.py:170
#, python-format
msgid "Deprecated since version %s"
msgstr "Не рекомендуется, начиная с версии %s"
-#: sphinx/locale/__init__.py:159
+#: sphinx/locale/__init__.py:176
msgid "keyword"
msgstr "ключевое слово"
-#: sphinx/locale/__init__.py:160
+#: sphinx/locale/__init__.py:177
msgid "operator"
msgstr "оператор"
-#: sphinx/locale/__init__.py:161
+#: sphinx/locale/__init__.py:178
msgid "object"
msgstr "объект"
-#: sphinx/locale/__init__.py:163
+#: sphinx/locale/__init__.py:180
msgid "statement"
msgstr "команда"
-#: sphinx/locale/__init__.py:164
+#: sphinx/locale/__init__.py:181
msgid "built-in function"
msgstr "базовая функция"
@@ -511,8 +531,8 @@ msgstr "базовая функция"
msgid "Table Of Contents"
msgstr "Содержание"
-#: sphinx/themes/agogo/layout.html:49 sphinx/themes/basic/layout.html:128
-#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:14
+#: sphinx/themes/agogo/layout.html:49 sphinx/themes/basic/layout.html:137
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:20
msgid "Search"
msgstr "Поиск"
@@ -560,15 +580,15 @@ msgstr "сводный список всех модулей"
msgid "all functions, classes, terms"
msgstr "все функции, классы, переменные и константы"
-#: sphinx/themes/basic/genindex-single.html:14
+#: sphinx/themes/basic/genindex-single.html:35
#, python-format
msgid "Index &ndash; %(key)s"
msgstr "Алфавитный указатель &ndash; %(key)s"
-#: sphinx/themes/basic/genindex-single.html:46
+#: sphinx/themes/basic/genindex-single.html:63
#: sphinx/themes/basic/genindex-split.html:24
#: sphinx/themes/basic/genindex-split.html:38
-#: sphinx/themes/basic/genindex.html:56
+#: sphinx/themes/basic/genindex.html:74
msgid "Full index on one page"
msgstr "Полный алфавитный указатель на одной странице"
@@ -580,39 +600,39 @@ msgstr "Указатели по буквам алфавита"
msgid "can be huge"
msgstr "может быть очень большим"
-#: sphinx/themes/basic/layout.html:23
+#: sphinx/themes/basic/layout.html:29
msgid "Navigation"
msgstr "Просмотр"
-#: sphinx/themes/basic/layout.html:113
+#: sphinx/themes/basic/layout.html:122
#, python-format
msgid "Search within %(docstitle)s"
msgstr "Поиск в документе «%(docstitle)s»"
-#: sphinx/themes/basic/layout.html:122
+#: sphinx/themes/basic/layout.html:131
msgid "About these documents"
msgstr "Об этих документах…"
-#: sphinx/themes/basic/layout.html:131
+#: sphinx/themes/basic/layout.html:140
msgid "Copyright"
msgstr "Copyright"
-#: sphinx/themes/basic/layout.html:180
+#: sphinx/themes/basic/layout.html:189
#, python-format
msgid "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
msgstr "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
-#: sphinx/themes/basic/layout.html:182
+#: sphinx/themes/basic/layout.html:191
#, python-format
msgid "&copy; Copyright %(copyright)s."
msgstr "&copy; Copyright %(copyright)s."
-#: sphinx/themes/basic/layout.html:186
+#: sphinx/themes/basic/layout.html:195
#, python-format
msgid "Last updated on %(last_updated)s."
msgstr "Дата последнего обновления: %(last_updated)s."
-#: sphinx/themes/basic/layout.html:189
+#: sphinx/themes/basic/layout.html:198
#, python-format
msgid ""
"Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
@@ -642,13 +662,13 @@ msgstr "Следующий раздел"
msgid "next chapter"
msgstr "следующая глава"
-#: sphinx/themes/basic/search.html:18
+#: sphinx/themes/basic/search.html:24
msgid ""
"Please activate JavaScript to enable the search\n"
" functionality."
msgstr "Для выполнения поиска необходима поддержка JavaScript в браузере."
-#: sphinx/themes/basic/search.html:23
+#: sphinx/themes/basic/search.html:29
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"
@@ -661,16 +681,15 @@ msgstr ""
"упомянуты все указанные слова. Страницы, в которых встречается только "
"часть этих слов, отобраны не будут."
-#: sphinx/themes/basic/search.html:30
+#: sphinx/themes/basic/search.html:36
msgid "search"
msgstr "искать"
-#: sphinx/themes/basic/search.html:34
-#: sphinx/themes/basic/static/searchtools.js:489
+#: sphinx/themes/basic/search.html:40
msgid "Search Results"
msgstr "Результаты поиска"
-#: sphinx/themes/basic/search.html:36
+#: sphinx/themes/basic/search.html:42
msgid "Your search did not match any results."
msgstr "Результатов по вашему запросу не найдено."
@@ -710,12 +729,12 @@ msgstr "Изменения в C API"
msgid "Other changes"
msgstr "Другие изменения"
-#: sphinx/themes/basic/static/doctools.js:154 sphinx/writers/html.py:482
-#: sphinx/writers/html.py:487
+#: sphinx/themes/basic/static/doctools.js:154 sphinx/writers/html.py:504
+#: sphinx/writers/html.py:510
msgid "Permalink to this headline"
msgstr "Ссылка на этот заголовок"
-#: sphinx/themes/basic/static/doctools.js:160 sphinx/writers/html.py:87
+#: sphinx/themes/basic/static/doctools.js:160 sphinx/writers/html.py:92
msgid "Permalink to this definition"
msgstr "Ссылка на это определение"
@@ -723,37 +742,12 @@ msgstr "Ссылка на это определение"
msgid "Hide Search Matches"
msgstr "Снять выделение"
-#: sphinx/themes/basic/static/searchtools.js:285
-msgid "Searching"
-msgstr "Поиск"
-
-#: sphinx/themes/basic/static/searchtools.js:290
-msgid "Preparing search..."
-msgstr "Подготовка к поиску..."
-
-#: sphinx/themes/basic/static/searchtools.js:364
-msgid ", in "
-msgstr ", в "
-
-#: sphinx/themes/basic/static/searchtools.js:491
-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/themes/basic/static/searchtools.js:493
-#, python-format
-msgid "Search finished, found %s page(s) matching the search query."
-msgstr "Поиск окончен, найдено страниц: %s."
-
-#: sphinx/themes/default/static/sidebar.js:66
+#: sphinx/themes/default/static/sidebar.js:69
msgid "Expand sidebar"
msgstr ""
-#: sphinx/themes/default/static/sidebar.js:79
-#: sphinx/themes/default/static/sidebar.js:106
+#: sphinx/themes/default/static/sidebar.js:82
+#: sphinx/themes/default/static/sidebar.js:110
msgid "Collapse sidebar"
msgstr ""
@@ -761,23 +755,25 @@ msgstr ""
msgid "Contents"
msgstr ""
-#: sphinx/writers/latex.py:171
+#: sphinx/writers/latex.py:177
msgid "Release"
msgstr "Выпуск"
-#: sphinx/writers/latex.py:572 sphinx/writers/manpage.py:178
+#: sphinx/writers/latex.py:594 sphinx/writers/manpage.py:182
+#: sphinx/writers/texinfo.py:589
msgid "Footnotes"
msgstr ""
-#: sphinx/writers/latex.py:641
+#: sphinx/writers/latex.py:676
msgid "continued from previous page"
msgstr ""
-#: sphinx/writers/latex.py:646
+#: sphinx/writers/latex.py:681
#, fuzzy
msgid "Continued on next page"
msgstr "Полный алфавитный указатель на одной странице"
-#: sphinx/writers/text.py:422
+#: sphinx/writers/text.py:437
msgid "[image]"
msgstr "[рисунок]"
+
diff --git a/sphinx/locale/sl/LC_MESSAGES/sphinx.js b/sphinx/locale/sl/LC_MESSAGES/sphinx.js
index 2a2f960a..2bcb33da 100644
--- a/sphinx/locale/sl/LC_MESSAGES/sphinx.js
+++ b/sphinx/locale/sl/LC_MESSAGES/sphinx.js
@@ -1 +1 @@
-Documentation.addTranslations({"locale": "sl", "plural_expr": "0", "messages": {"Search Results": "Rezultati Iskanja", "Preparing search...": "Pripravljam iskanje...", "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "Za va\u0161e iskanje ni rezultatov. Prosimo preglejte ali so vse besede pravilno \u010drkovane in ali ste izbrali dovolj kategorij.", "Search finished, found %s page(s) matching the search query.": "Iskanje kon\u010dano, najdeno %s strani, ki ustrezajo iskalnemu nizu.", ", in ": ", v ", "Expand sidebar": "", "Permalink to this headline": "Povezava na naslov", "Searching": "I\u0161\u010dem", "Collapse sidebar": "", "Permalink to this definition": "Povezava na to definicijo", "Hide Search Matches": "Skrij resultate iskanja"}}); \ No newline at end of file
+Documentation.addTranslations({"locale": "sl", "plural_expr": "0", "messages": {"Hide Search Matches": "Skrij resultate iskanja", "Permalink to this definition": "Povezava na to definicijo", "Expand sidebar": "", "Permalink to this headline": "Povezava na naslov", "Collapse sidebar": ""}}); \ No newline at end of file
diff --git a/sphinx/locale/sl/LC_MESSAGES/sphinx.mo b/sphinx/locale/sl/LC_MESSAGES/sphinx.mo
index 21e64ffd..79f7f4eb 100644
--- a/sphinx/locale/sl/LC_MESSAGES/sphinx.mo
+++ b/sphinx/locale/sl/LC_MESSAGES/sphinx.mo
Binary files differ
diff --git a/sphinx/locale/sl/LC_MESSAGES/sphinx.po b/sphinx/locale/sl/LC_MESSAGES/sphinx.po
index 6028c35c..6f6e49ac 100644
--- a/sphinx/locale/sl/LC_MESSAGES/sphinx.po
+++ b/sphinx/locale/sl/LC_MESSAGES/sphinx.po
@@ -3,387 +3,406 @@ msgid ""
msgstr ""
"Project-Id-Version: Sphinx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2008-09-11 23:58+0200\n"
-"PO-Revision-Date: 2010-05-24 23:54+0200\n"
+"POT-Creation-Date: 2011-09-21 10:06+0200\n"
+"PO-Revision-Date: 2011-09-21 10:14+0200\n"
"Last-Translator: Luka Marinko <luka.marinko@simt.si>\n"
"Language-Team: Rok Garbas <rok.garbas@gmail.com>\n"
"Plural-Forms: nplurals=1; plural=0\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"
+"Generated-By: Babel 0.9.6\n"
-#: sphinx/environment.py:106 sphinx/writers/latex.py:184
-#: sphinx/writers/manpage.py:67
+#: sphinx/config.py:81
+#, python-format
+msgid "%s %s documentation"
+msgstr ""
+
+#: sphinx/environment.py:119 sphinx/writers/latex.py:190
+#: sphinx/writers/manpage.py:67 sphinx/writers/texinfo.py:203
#, python-format
msgid "%B %d, %Y"
msgstr "%d %B, %Y"
-#: sphinx/roles.py:174
+#: sphinx/environment.py:1625
+#, python-format
+msgid "see %s"
+msgstr ""
+
+#: sphinx/environment.py:1628
+#, python-format
+msgid "see also %s"
+msgstr ""
+
+#: sphinx/roles.py:175
#, python-format
-msgid "Python Enhancement Proposals!PEP %s"
-msgstr "Python Enhancement Proposals!PEP %s"
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr "Python Enhancement Proposals; PEP %s"
-#: sphinx/builders/changes.py:72
+#: sphinx/builders/changes.py:73
msgid "Builtins"
msgstr "Vgrajeni deli"
-#: sphinx/builders/changes.py:74
+#: sphinx/builders/changes.py:75
msgid "Module level"
msgstr "Nivo modula"
-#: sphinx/builders/html.py:266
+#: sphinx/builders/html.py:274
#, python-format
msgid "%b %d, %Y"
msgstr "%d %b, %Y"
-#: sphinx/builders/html.py:285 sphinx/themes/basic/defindex.html:30
+#: sphinx/builders/html.py:293 sphinx/themes/basic/defindex.html:30
msgid "General Index"
msgstr "Splošni abecedni seznam"
-#: sphinx/builders/html.py:285
+#: sphinx/builders/html.py:293
msgid "index"
msgstr "abecedni seznam"
-#: sphinx/builders/html.py:345
+#: sphinx/builders/html.py:353
msgid "next"
msgstr "naprej"
-#: sphinx/builders/html.py:354
+#: sphinx/builders/html.py:362
msgid "previous"
msgstr "nazaj"
-#: sphinx/builders/latex.py:151
+#: sphinx/builders/latex.py:141 sphinx/builders/texinfo.py:196
msgid " (in "
msgstr " (v "
-#: sphinx/directives/other.py:127
+#: sphinx/directives/other.py:136
msgid "Section author: "
msgstr "Avtor sekcije: "
-#: sphinx/directives/other.py:129
+#: sphinx/directives/other.py:138
msgid "Module author: "
msgstr "Avtor modula: "
-#: sphinx/directives/other.py:131
+#: sphinx/directives/other.py:140
#, fuzzy
msgid "Code author: "
msgstr "Avtor modula: "
-#: sphinx/directives/other.py:133
+#: sphinx/directives/other.py:142
msgid "Author: "
msgstr "Avtor: "
-#: sphinx/directives/other.py:238
+#: sphinx/directives/other.py:215
msgid "See also"
msgstr "Poglej Tudi"
-#: sphinx/domains/__init__.py:253
+#: sphinx/domains/__init__.py:244
#, python-format
msgid "%s %s"
msgstr ""
-#: sphinx/domains/c.py:51 sphinx/domains/python.py:49
+#: sphinx/domains/c.py:51 sphinx/domains/python.py:95
msgid "Parameters"
msgstr "Parametri"
-#: sphinx/domains/c.py:54 sphinx/domains/javascript.py:137
-#: sphinx/domains/python.py:59
+#: sphinx/domains/c.py:54 sphinx/domains/javascript.py:128
+#: sphinx/domains/python.py:107
msgid "Returns"
msgstr "Vrne"
-#: sphinx/domains/c.py:56 sphinx/domains/python.py:61
+#: sphinx/domains/c.py:56 sphinx/domains/python.py:109
msgid "Return type"
msgstr "Vrne tip"
-#: sphinx/domains/c.py:133
+#: sphinx/domains/c.py:141
#, python-format
msgid "%s (C function)"
msgstr "%s (C funkcija)"
-#: sphinx/domains/c.py:135
+#: sphinx/domains/c.py:143
#, python-format
msgid "%s (C member)"
msgstr "%s (C član)"
-#: sphinx/domains/c.py:137
+#: sphinx/domains/c.py:145
#, python-format
msgid "%s (C macro)"
msgstr "%s (C makro)"
-#: sphinx/domains/c.py:139
+#: sphinx/domains/c.py:147
#, python-format
msgid "%s (C type)"
msgstr "%s (C tip)"
-#: sphinx/domains/c.py:141
+#: sphinx/domains/c.py:149
#, python-format
msgid "%s (C variable)"
msgstr "%s (C spremenljivka)"
-#: sphinx/domains/c.py:171 sphinx/domains/cpp.py:1031
-#: sphinx/domains/javascript.py:166 sphinx/domains/python.py:497
+#: sphinx/domains/c.py:204 sphinx/domains/cpp.py:1060
+#: sphinx/domains/javascript.py:162 sphinx/domains/python.py:559
msgid "function"
msgstr "funkcija"
-#: sphinx/domains/c.py:172 sphinx/domains/cpp.py:1032
+#: sphinx/domains/c.py:205 sphinx/domains/cpp.py:1061
msgid "member"
msgstr "član"
-#: sphinx/domains/c.py:173
+#: sphinx/domains/c.py:206
msgid "macro"
msgstr ""
-#: sphinx/domains/c.py:174 sphinx/domains/cpp.py:1033
+#: sphinx/domains/c.py:207 sphinx/domains/cpp.py:1062
msgid "type"
msgstr "tip"
-#: sphinx/domains/c.py:175
+#: sphinx/domains/c.py:208
#, fuzzy
msgid "variable"
msgstr "Spremenljivka"
-#: sphinx/domains/cpp.py:876
+#: sphinx/domains/cpp.py:904
#, python-format
msgid "%s (C++ class)"
msgstr "%s (C++ razred)"
-#: sphinx/domains/cpp.py:891
+#: sphinx/domains/cpp.py:919
#, python-format
msgid "%s (C++ type)"
msgstr "%s (C++ tip)"
-#: sphinx/domains/cpp.py:910
+#: sphinx/domains/cpp.py:938
#, python-format
msgid "%s (C++ member)"
msgstr "%s (C++ član)"
-#: sphinx/domains/cpp.py:962
+#: sphinx/domains/cpp.py:990
#, python-format
msgid "%s (C++ function)"
msgstr "%s (C++ funkcija)"
-#: sphinx/domains/cpp.py:1030 sphinx/domains/python.py:499
+#: sphinx/domains/cpp.py:1059 sphinx/domains/javascript.py:163
+#: sphinx/domains/python.py:561
msgid "class"
msgstr "razred"
-#: sphinx/domains/javascript.py:117 sphinx/domains/python.py:221
+#: sphinx/domains/javascript.py:106 sphinx/domains/python.py:254
#, python-format
msgid "%s() (built-in function)"
msgstr "%s() (vgrajene funkcije)"
-#: sphinx/domains/javascript.py:118 sphinx/domains/python.py:285
+#: sphinx/domains/javascript.py:107 sphinx/domains/python.py:318
#, python-format
msgid "%s() (%s method)"
msgstr "%s() (%s metoda)"
-#: sphinx/domains/javascript.py:120
+#: sphinx/domains/javascript.py:109
+#, python-format
+msgid "%s() (class)"
+msgstr "%s() (razred)"
+
+#: sphinx/domains/javascript.py:111
#, python-format
msgid "%s (global variable or constant)"
msgstr ""
-#: sphinx/domains/javascript.py:122 sphinx/domains/python.py:323
+#: sphinx/domains/javascript.py:113 sphinx/domains/python.py:356
#, python-format
msgid "%s (%s attribute)"
msgstr "%s (%s atribut)"
-#: sphinx/domains/javascript.py:131
+#: sphinx/domains/javascript.py:122
#, fuzzy
msgid "Arguments"
msgstr "Parametri"
-#: sphinx/domains/javascript.py:134
+#: sphinx/domains/javascript.py:125
msgid "Throws"
msgstr ""
-#: sphinx/domains/javascript.py:167 sphinx/domains/python.py:498
+#: sphinx/domains/javascript.py:164 sphinx/domains/python.py:560
msgid "data"
msgstr ""
-#: sphinx/domains/javascript.py:168 sphinx/domains/python.py:504
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:566
msgid "attribute"
msgstr "atribut"
-#: sphinx/domains/python.py:53
+#: sphinx/domains/python.py:100
#, fuzzy
msgid "Variables"
msgstr "Spremenljivka"
-#: sphinx/domains/python.py:56
+#: sphinx/domains/python.py:104
msgid "Raises"
msgstr "Sproži izjemo"
-#: sphinx/domains/python.py:222 sphinx/domains/python.py:279
-#: sphinx/domains/python.py:291 sphinx/domains/python.py:304
+#: sphinx/domains/python.py:255 sphinx/domains/python.py:312
+#: sphinx/domains/python.py:324 sphinx/domains/python.py:337
#, python-format
msgid "%s() (in module %s)"
msgstr "%s() (v modulu %s)"
-#: sphinx/domains/python.py:225
+#: sphinx/domains/python.py:258
#, python-format
msgid "%s (built-in variable)"
msgstr "%s (vgrajene spremenljivke)"
-#: sphinx/domains/python.py:226 sphinx/domains/python.py:317
+#: sphinx/domains/python.py:259 sphinx/domains/python.py:350
#, python-format
msgid "%s (in module %s)"
msgstr "%s (v modulu %s)"
-#: sphinx/domains/python.py:242
+#: sphinx/domains/python.py:275
#, python-format
msgid "%s (built-in class)"
msgstr "%s (vgrajen razred)"
-#: sphinx/domains/python.py:243
+#: sphinx/domains/python.py:276
#, python-format
msgid "%s (class in %s)"
msgstr "%s (razred v %s)"
-#: sphinx/domains/python.py:283
+#: sphinx/domains/python.py:316
#, python-format
msgid "%s() (%s.%s method)"
msgstr "%s() (%s.%s metoda)"
-#: sphinx/domains/python.py:295
+#: sphinx/domains/python.py:328
#, python-format
msgid "%s() (%s.%s static method)"
msgstr "%s() (%s.%s statična metoda)"
-#: sphinx/domains/python.py:298
+#: sphinx/domains/python.py:331
#, python-format
msgid "%s() (%s static method)"
msgstr "%s() (%s statična metoda)"
-#: sphinx/domains/python.py:308
+#: sphinx/domains/python.py:341
#, fuzzy, python-format
msgid "%s() (%s.%s class method)"
msgstr "%s() (%s.%s metoda)"
-#: sphinx/domains/python.py:311
+#: sphinx/domains/python.py:344
#, fuzzy, python-format
msgid "%s() (%s class method)"
msgstr "%s() (%s metoda)"
-#: sphinx/domains/python.py:321
+#: sphinx/domains/python.py:354
#, python-format
msgid "%s (%s.%s attribute)"
msgstr "%s (%s.%s atribut)"
-#: sphinx/domains/python.py:366
-msgid "Platforms: "
-msgstr "Platforme:"
-
-#: sphinx/domains/python.py:372
+#: sphinx/domains/python.py:434
#, python-format
msgid "%s (module)"
msgstr "%s (modul)"
-#: sphinx/domains/python.py:429
+#: sphinx/domains/python.py:491
#, fuzzy
msgid "Python Module Index"
msgstr "Seznam modulov"
-#: sphinx/domains/python.py:430
+#: sphinx/domains/python.py:492
msgid "modules"
msgstr "Moduli"
-#: sphinx/domains/python.py:475
+#: sphinx/domains/python.py:537
msgid "Deprecated"
msgstr "Zastarelo"
-#: sphinx/domains/python.py:500 sphinx/locale/__init__.py:162
+#: sphinx/domains/python.py:562 sphinx/locale/__init__.py:179
msgid "exception"
msgstr "izjema"
-#: sphinx/domains/python.py:501
+#: sphinx/domains/python.py:563
msgid "method"
msgstr ""
-#: sphinx/domains/python.py:502
-#, fuzzy, python-format
+#: sphinx/domains/python.py:564
msgid "class method"
-msgstr "%s() (%s metoda)"
+msgstr ""
-#: sphinx/domains/python.py:503
+#: sphinx/domains/python.py:565
msgid "static method"
msgstr "statična metoda"
-#: sphinx/domains/python.py:505 sphinx/locale/__init__.py:158
+#: sphinx/domains/python.py:567 sphinx/locale/__init__.py:175
msgid "module"
msgstr "modul"
-#: sphinx/domains/rst.py:53
+#: sphinx/domains/python.py:695
+msgid " (deprecated)"
+msgstr " (zastarelo)"
+
+#: sphinx/domains/rst.py:55
#, python-format
msgid "%s (directive)"
msgstr ""
-#: sphinx/domains/rst.py:55
-#, fuzzy, python-format
+#: sphinx/domains/rst.py:57
+#, python-format
msgid "%s (role)"
-msgstr "%s (modul)"
+msgstr ""
-#: sphinx/domains/rst.py:103
+#: sphinx/domains/rst.py:106
msgid "directive"
msgstr ""
-#: sphinx/domains/rst.py:104
-#, fuzzy
+#: sphinx/domains/rst.py:107
msgid "role"
-msgstr "modul"
+msgstr ""
-#: sphinx/domains/std.py:68 sphinx/domains/std.py:84
+#: sphinx/domains/std.py:70 sphinx/domains/std.py:86
#, python-format
msgid "environment variable; %s"
msgstr "okoljska spremenljivka; %s"
-#: sphinx/domains/std.py:160
+#: sphinx/domains/std.py:162
#, python-format
msgid "%scommand line option; %s"
msgstr "%scommand line parameter; %s"
-#: sphinx/domains/std.py:328
+#: sphinx/domains/std.py:393
msgid "glossary term"
msgstr ""
-#: sphinx/domains/std.py:329
+#: sphinx/domains/std.py:394
msgid "grammar token"
msgstr ""
-#: sphinx/domains/std.py:330
+#: sphinx/domains/std.py:395
msgid "reference label"
msgstr ""
-#: sphinx/domains/std.py:331
+#: sphinx/domains/std.py:396
msgid "environment variable"
msgstr "okoljska spremenljivka"
-#: sphinx/domains/std.py:332
+#: sphinx/domains/std.py:397
msgid "program option"
msgstr ""
-#: sphinx/domains/std.py:360 sphinx/themes/basic/genindex-single.html:11
+#: sphinx/domains/std.py:427 sphinx/themes/basic/genindex-single.html:32
#: sphinx/themes/basic/genindex-split.html:11
#: sphinx/themes/basic/genindex-split.html:14
-#: sphinx/themes/basic/genindex.html:11 sphinx/themes/basic/genindex.html:14
-#: sphinx/themes/basic/genindex.html:50 sphinx/themes/basic/layout.html:125
-#: sphinx/writers/latex.py:173
+#: sphinx/themes/basic/genindex.html:32 sphinx/themes/basic/genindex.html:35
+#: sphinx/themes/basic/genindex.html:68 sphinx/themes/basic/layout.html:134
+#: sphinx/writers/latex.py:179 sphinx/writers/texinfo.py:456
msgid "Index"
msgstr "Abecedni seznam"
-#: sphinx/domains/std.py:361
+#: sphinx/domains/std.py:428
msgid "Module Index"
msgstr "Seznam modulov"
-#: sphinx/domains/std.py:362 sphinx/themes/basic/defindex.html:25
+#: sphinx/domains/std.py:429 sphinx/themes/basic/defindex.html:25
msgid "Search Page"
msgstr "Iskalnik"
-#: sphinx/ext/autodoc.py:917
+#: sphinx/ext/autodoc.py:1002
#, python-format
msgid " Bases: %s"
msgstr " Baza: %s"
-#: sphinx/ext/autodoc.py:950
+#: sphinx/ext/autodoc.py:1038
#, python-format
msgid "alias of :class:`%s`"
msgstr "vzdevek za :class:`%s`"
@@ -395,110 +414,110 @@ msgstr "Todo"
#: sphinx/ext/todo.py:109
#, fuzzy, python-format
msgid "(The <<original entry>> is located in %s, line %d.)"
-msgstr "(Originalen vnos se nahaja v %s, v vrstici %d, in ga je moč poiskati "
+msgstr "(<<Originalen vnos>> se nahaja v %s, v vrstici %d.)"
#: sphinx/ext/todo.py:117
msgid "original entry"
msgstr ""
-#: sphinx/ext/viewcode.py:66
+#: sphinx/ext/viewcode.py:70
msgid "[source]"
msgstr ""
-#: sphinx/ext/viewcode.py:109
+#: sphinx/ext/viewcode.py:117
msgid "[docs]"
msgstr ""
-#: sphinx/ext/viewcode.py:123
+#: sphinx/ext/viewcode.py:131
#, fuzzy
msgid "Module code"
msgstr "modul"
-#: sphinx/ext/viewcode.py:129
+#: sphinx/ext/viewcode.py:137
#, python-format
msgid "<h1>Source code for %s</h1>"
msgstr ""
-#: sphinx/ext/viewcode.py:156
+#: sphinx/ext/viewcode.py:164
msgid "Overview: module code"
msgstr ""
-#: sphinx/ext/viewcode.py:157
+#: sphinx/ext/viewcode.py:165
msgid "<h1>All modules for which code is available</h1>"
msgstr ""
-#: sphinx/locale/__init__.py:139
+#: sphinx/locale/__init__.py:155
msgid "Attention"
msgstr "Pozor"
-#: sphinx/locale/__init__.py:140
+#: sphinx/locale/__init__.py:156
msgid "Caution"
msgstr "Previdno"
-#: sphinx/locale/__init__.py:141
+#: sphinx/locale/__init__.py:157
msgid "Danger"
msgstr "Nevarno"
-#: sphinx/locale/__init__.py:142
+#: sphinx/locale/__init__.py:158
msgid "Error"
msgstr "Napaka"
-#: sphinx/locale/__init__.py:143
+#: sphinx/locale/__init__.py:159
msgid "Hint"
msgstr "Nasvet"
-#: sphinx/locale/__init__.py:144
+#: sphinx/locale/__init__.py:160
msgid "Important"
msgstr "Pomembno"
-#: sphinx/locale/__init__.py:145
+#: sphinx/locale/__init__.py:161
msgid "Note"
msgstr "Opomba"
-#: sphinx/locale/__init__.py:146
+#: sphinx/locale/__init__.py:162
msgid "See Also"
msgstr "Poglej Tudi"
-#: sphinx/locale/__init__.py:147
+#: sphinx/locale/__init__.py:163
msgid "Tip"
msgstr "Nasvet"
-#: sphinx/locale/__init__.py:148
+#: sphinx/locale/__init__.py:164
msgid "Warning"
msgstr "Opozorilo"
-#: sphinx/locale/__init__.py:152
+#: sphinx/locale/__init__.py:168
#, python-format
msgid "New in version %s"
msgstr "Novo v verziji %s"
-#: sphinx/locale/__init__.py:153
+#: sphinx/locale/__init__.py:169
#, python-format
msgid "Changed in version %s"
msgstr "Spremenjeno v verziji %s"
-#: sphinx/locale/__init__.py:154
+#: sphinx/locale/__init__.py:170
#, python-format
msgid "Deprecated since version %s"
msgstr "Zastarelo od verzije %s"
-#: sphinx/locale/__init__.py:159
+#: sphinx/locale/__init__.py:176
msgid "keyword"
msgstr "ključna beseda"
-#: sphinx/locale/__init__.py:160
+#: sphinx/locale/__init__.py:177
msgid "operator"
msgstr "operator"
-#: sphinx/locale/__init__.py:161
+#: sphinx/locale/__init__.py:178
msgid "object"
msgstr "objekt"
-#: sphinx/locale/__init__.py:163
+#: sphinx/locale/__init__.py:180
msgid "statement"
msgstr "izjava"
-#: sphinx/locale/__init__.py:164
+#: sphinx/locale/__init__.py:181
msgid "built-in function"
msgstr "vgrajene funkcije"
@@ -507,8 +526,8 @@ msgstr "vgrajene funkcije"
msgid "Table Of Contents"
msgstr "Seznam Vsebine"
-#: sphinx/themes/agogo/layout.html:49 sphinx/themes/basic/layout.html:128
-#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:14
+#: sphinx/themes/agogo/layout.html:49 sphinx/themes/basic/layout.html:137
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:20
msgid "Search"
msgstr "Išči"
@@ -556,15 +575,15 @@ msgstr "hiter dostop do vseh modulov"
msgid "all functions, classes, terms"
msgstr "vse funkcije, razredi, izrazi"
-#: sphinx/themes/basic/genindex-single.html:14
+#: sphinx/themes/basic/genindex-single.html:35
#, python-format
msgid "Index &ndash; %(key)s"
msgstr "Seznam &ndash; %(key)s"
-#: sphinx/themes/basic/genindex-single.html:46
+#: sphinx/themes/basic/genindex-single.html:63
#: sphinx/themes/basic/genindex-split.html:24
#: sphinx/themes/basic/genindex-split.html:38
-#: sphinx/themes/basic/genindex.html:56
+#: sphinx/themes/basic/genindex.html:74
msgid "Full index on one page"
msgstr "Poln indeks na eni strani"
@@ -576,39 +595,39 @@ msgstr "Indeksiraj strani po črki"
msgid "can be huge"
msgstr "lahko je veliko"
-#: sphinx/themes/basic/layout.html:23
+#: sphinx/themes/basic/layout.html:29
msgid "Navigation"
msgstr "Navigacija"
-#: sphinx/themes/basic/layout.html:113
+#: sphinx/themes/basic/layout.html:122
#, python-format
msgid "Search within %(docstitle)s"
msgstr "Išči med %(docstitle)s"
-#: sphinx/themes/basic/layout.html:122
+#: sphinx/themes/basic/layout.html:131
msgid "About these documents"
msgstr "O dokumentih"
-#: sphinx/themes/basic/layout.html:131
+#: sphinx/themes/basic/layout.html:140
msgid "Copyright"
msgstr "Vse pravice pridržane"
-#: sphinx/themes/basic/layout.html:180
+#: sphinx/themes/basic/layout.html:189
#, python-format
msgid "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
msgstr "&copy; <a href=\"%(path)s\">Vse pravice pridržane</a> %(copyright)s."
-#: sphinx/themes/basic/layout.html:182
+#: sphinx/themes/basic/layout.html:191
#, python-format
msgid "&copy; Copyright %(copyright)s."
msgstr "&copy; Vse pravice pridržane %(copyright)s."
-#: sphinx/themes/basic/layout.html:186
+#: sphinx/themes/basic/layout.html:195
#, python-format
msgid "Last updated on %(last_updated)s."
msgstr "Zadnjič posodobljeno %(last_updated)s."
-#: sphinx/themes/basic/layout.html:189
+#: sphinx/themes/basic/layout.html:198
#, python-format
msgid ""
"Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
@@ -638,7 +657,7 @@ msgstr "Naslednja tema"
msgid "next chapter"
msgstr "naslednje poglavje"
-#: sphinx/themes/basic/search.html:18
+#: sphinx/themes/basic/search.html:24
msgid ""
"Please activate JavaScript to enable the search\n"
" functionality."
@@ -646,7 +665,7 @@ msgstr ""
"Za pravilno delovanje Iskanja morete vklopiti\n"
" JavaScript."
-#: sphinx/themes/basic/search.html:23
+#: sphinx/themes/basic/search.html:29
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"
@@ -658,16 +677,15 @@ msgstr ""
" bo iskalo po vseh besedah v iskalnem nizu. Strani, ki ne\n"
" vsebujejo vseh besed ne bodo prikazane na seznamu rezultatov."
-#: sphinx/themes/basic/search.html:30
+#: sphinx/themes/basic/search.html:36
msgid "search"
msgstr "išči"
-#: sphinx/themes/basic/search.html:34
-#: sphinx/themes/basic/static/searchtools.js:489
+#: sphinx/themes/basic/search.html:40
msgid "Search Results"
msgstr "Rezultati Iskanja"
-#: sphinx/themes/basic/search.html:36
+#: sphinx/themes/basic/search.html:42
msgid "Your search did not match any results."
msgstr "Vaše iskanje ni imelo nobenega zadetka."
@@ -707,12 +725,12 @@ msgstr "C API spremembe"
msgid "Other changes"
msgstr "Ostale spremembe"
-#: sphinx/themes/basic/static/doctools.js:154 sphinx/writers/html.py:482
-#: sphinx/writers/html.py:487
+#: sphinx/themes/basic/static/doctools.js:154 sphinx/writers/html.py:504
+#: sphinx/writers/html.py:510
msgid "Permalink to this headline"
msgstr "Povezava na naslov"
-#: sphinx/themes/basic/static/doctools.js:160 sphinx/writers/html.py:87
+#: sphinx/themes/basic/static/doctools.js:160 sphinx/writers/html.py:92
msgid "Permalink to this definition"
msgstr "Povezava na to definicijo"
@@ -720,37 +738,12 @@ msgstr "Povezava na to definicijo"
msgid "Hide Search Matches"
msgstr "Skrij resultate iskanja"
-#: sphinx/themes/basic/static/searchtools.js:285
-msgid "Searching"
-msgstr "Iščem"
-
-#: sphinx/themes/basic/static/searchtools.js:290
-msgid "Preparing search..."
-msgstr "Pripravljam iskanje..."
-
-#: sphinx/themes/basic/static/searchtools.js:364
-msgid ", in "
-msgstr ", v "
-
-#: sphinx/themes/basic/static/searchtools.js:491
-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 ""
-"Za vaše iskanje ni rezultatov. Prosimo preglejte ali so vse besede "
-"pravilno črkovane in ali ste izbrali dovolj kategorij."
-
-#: sphinx/themes/basic/static/searchtools.js:493
-#, python-format
-msgid "Search finished, found %s page(s) matching the search query."
-msgstr "Iskanje končano, najdeno %s strani, ki ustrezajo iskalnemu nizu."
-
-#: sphinx/themes/default/static/sidebar.js:66
+#: sphinx/themes/default/static/sidebar.js:69
msgid "Expand sidebar"
msgstr ""
-#: sphinx/themes/default/static/sidebar.js:79
-#: sphinx/themes/default/static/sidebar.js:106
+#: sphinx/themes/default/static/sidebar.js:82
+#: sphinx/themes/default/static/sidebar.js:110
msgid "Collapse sidebar"
msgstr ""
@@ -758,22 +751,24 @@ msgstr ""
msgid "Contents"
msgstr ""
-#: sphinx/writers/latex.py:171
+#: sphinx/writers/latex.py:177
msgid "Release"
msgstr "Izdaja"
-#: sphinx/writers/latex.py:572 sphinx/writers/manpage.py:178
+#: sphinx/writers/latex.py:594 sphinx/writers/manpage.py:182
+#: sphinx/writers/texinfo.py:589
msgid "Footnotes"
msgstr "Opombe"
-#: sphinx/writers/latex.py:641
+#: sphinx/writers/latex.py:676
msgid "continued from previous page"
msgstr "nadaljevanje iz prejšnje strani"
-#: sphinx/writers/latex.py:646
+#: sphinx/writers/latex.py:681
msgid "Continued on next page"
msgstr "Nadaljevanje na naslednji strani"
-#: sphinx/writers/text.py:422
+#: sphinx/writers/text.py:437
msgid "[image]"
msgstr "[slika]"
+
diff --git a/sphinx/locale/sphinx.pot b/sphinx/locale/sphinx.pot
index 955663aa..9ddde4c2 100644
--- a/sphinx/locale/sphinx.pot
+++ b/sphinx/locale/sphinx.pot
@@ -1,386 +1,407 @@
# Translations template for Sphinx.
-# Copyright (C) 2010 ORGANIZATION
+# Copyright (C) 2011 ORGANIZATION
# This file is distributed under the same license as the Sphinx project.
-# FIRST AUTHOR <EMAIL@ADDRESS>, 2010.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
#
#, fuzzy
msgid ""
msgstr ""
-"Project-Id-Version: Sphinx 1.0pre/8b971dbc7d36\n"
+"Project-Id-Version: Sphinx 1.1pre/9523af9ba9aa+\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2010-05-24 23:53+0200\n"
+"POT-Creation-Date: 2011-09-21 10:06+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 0.9.4\n"
+"Generated-By: Babel 0.9.6\n"
-#: sphinx/environment.py:106 sphinx/writers/latex.py:184
-#: sphinx/writers/manpage.py:67
+#: sphinx/config.py:81
+#, python-format
+msgid "%s %s documentation"
+msgstr ""
+
+#: sphinx/environment.py:119 sphinx/writers/latex.py:190
+#: sphinx/writers/manpage.py:67 sphinx/writers/texinfo.py:203
#, python-format
msgid "%B %d, %Y"
msgstr ""
-#: sphinx/roles.py:174
+#: sphinx/environment.py:1625
#, python-format
-msgid "Python Enhancement Proposals!PEP %s"
+msgid "see %s"
msgstr ""
-#: sphinx/builders/changes.py:72
+#: sphinx/environment.py:1628
+#, python-format
+msgid "see also %s"
+msgstr ""
+
+#: sphinx/roles.py:175
+#, python-format
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr ""
+
+#: sphinx/builders/changes.py:73
msgid "Builtins"
msgstr ""
-#: sphinx/builders/changes.py:74
+#: sphinx/builders/changes.py:75
msgid "Module level"
msgstr ""
-#: sphinx/builders/html.py:266
+#: sphinx/builders/html.py:274
#, python-format
msgid "%b %d, %Y"
msgstr ""
-#: sphinx/builders/html.py:285 sphinx/themes/basic/defindex.html:30
+#: sphinx/builders/html.py:293 sphinx/themes/basic/defindex.html:30
msgid "General Index"
msgstr ""
-#: sphinx/builders/html.py:285
+#: sphinx/builders/html.py:293
msgid "index"
msgstr ""
-#: sphinx/builders/html.py:345
+#: sphinx/builders/html.py:353
msgid "next"
msgstr ""
-#: sphinx/builders/html.py:354
+#: sphinx/builders/html.py:362
msgid "previous"
msgstr ""
-#: sphinx/builders/latex.py:151
+#: sphinx/builders/latex.py:141 sphinx/builders/texinfo.py:196
msgid " (in "
msgstr ""
-#: sphinx/directives/other.py:127
+#: sphinx/directives/other.py:136
msgid "Section author: "
msgstr ""
-#: sphinx/directives/other.py:129
+#: sphinx/directives/other.py:138
msgid "Module author: "
msgstr ""
-#: sphinx/directives/other.py:131
+#: sphinx/directives/other.py:140
msgid "Code author: "
msgstr ""
-#: sphinx/directives/other.py:133
+#: sphinx/directives/other.py:142
msgid "Author: "
msgstr ""
-#: sphinx/directives/other.py:238
+#: sphinx/directives/other.py:215
msgid "See also"
msgstr ""
-#: sphinx/domains/__init__.py:253
+#: sphinx/domains/__init__.py:244
#, python-format
msgid "%s %s"
msgstr ""
-#: sphinx/domains/c.py:51 sphinx/domains/python.py:49
+#: sphinx/domains/c.py:51 sphinx/domains/python.py:95
msgid "Parameters"
msgstr ""
-#: sphinx/domains/c.py:54 sphinx/domains/javascript.py:137
-#: sphinx/domains/python.py:59
+#: sphinx/domains/c.py:54 sphinx/domains/javascript.py:128
+#: sphinx/domains/python.py:107
msgid "Returns"
msgstr ""
-#: sphinx/domains/c.py:56 sphinx/domains/python.py:61
+#: sphinx/domains/c.py:56 sphinx/domains/python.py:109
msgid "Return type"
msgstr ""
-#: sphinx/domains/c.py:133
+#: sphinx/domains/c.py:141
#, python-format
msgid "%s (C function)"
msgstr ""
-#: sphinx/domains/c.py:135
+#: sphinx/domains/c.py:143
#, python-format
msgid "%s (C member)"
msgstr ""
-#: sphinx/domains/c.py:137
+#: sphinx/domains/c.py:145
#, python-format
msgid "%s (C macro)"
msgstr ""
-#: sphinx/domains/c.py:139
+#: sphinx/domains/c.py:147
#, python-format
msgid "%s (C type)"
msgstr ""
-#: sphinx/domains/c.py:141
+#: sphinx/domains/c.py:149
#, python-format
msgid "%s (C variable)"
msgstr ""
-#: sphinx/domains/c.py:171 sphinx/domains/cpp.py:1031
-#: sphinx/domains/javascript.py:166 sphinx/domains/python.py:497
+#: sphinx/domains/c.py:204 sphinx/domains/cpp.py:1060
+#: sphinx/domains/javascript.py:162 sphinx/domains/python.py:559
msgid "function"
msgstr ""
-#: sphinx/domains/c.py:172 sphinx/domains/cpp.py:1032
+#: sphinx/domains/c.py:205 sphinx/domains/cpp.py:1061
msgid "member"
msgstr ""
-#: sphinx/domains/c.py:173
+#: sphinx/domains/c.py:206
msgid "macro"
msgstr ""
-#: sphinx/domains/c.py:174 sphinx/domains/cpp.py:1033
+#: sphinx/domains/c.py:207 sphinx/domains/cpp.py:1062
msgid "type"
msgstr ""
-#: sphinx/domains/c.py:175
+#: sphinx/domains/c.py:208
msgid "variable"
msgstr ""
-#: sphinx/domains/cpp.py:876
+#: sphinx/domains/cpp.py:904
#, python-format
msgid "%s (C++ class)"
msgstr ""
-#: sphinx/domains/cpp.py:891
+#: sphinx/domains/cpp.py:919
#, python-format
msgid "%s (C++ type)"
msgstr ""
-#: sphinx/domains/cpp.py:910
+#: sphinx/domains/cpp.py:938
#, python-format
msgid "%s (C++ member)"
msgstr ""
-#: sphinx/domains/cpp.py:962
+#: sphinx/domains/cpp.py:990
#, python-format
msgid "%s (C++ function)"
msgstr ""
-#: sphinx/domains/cpp.py:1030 sphinx/domains/python.py:499
+#: sphinx/domains/cpp.py:1059 sphinx/domains/javascript.py:163
+#: sphinx/domains/python.py:561
msgid "class"
msgstr ""
-#: sphinx/domains/javascript.py:117 sphinx/domains/python.py:221
+#: sphinx/domains/javascript.py:106 sphinx/domains/python.py:254
#, python-format
msgid "%s() (built-in function)"
msgstr ""
-#: sphinx/domains/javascript.py:118 sphinx/domains/python.py:285
+#: sphinx/domains/javascript.py:107 sphinx/domains/python.py:318
#, python-format
msgid "%s() (%s method)"
msgstr ""
-#: sphinx/domains/javascript.py:120
+#: sphinx/domains/javascript.py:109
+#, python-format
+msgid "%s() (class)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:111
#, python-format
msgid "%s (global variable or constant)"
msgstr ""
-#: sphinx/domains/javascript.py:122 sphinx/domains/python.py:323
+#: sphinx/domains/javascript.py:113 sphinx/domains/python.py:356
#, python-format
msgid "%s (%s attribute)"
msgstr ""
-#: sphinx/domains/javascript.py:131
+#: sphinx/domains/javascript.py:122
msgid "Arguments"
msgstr ""
-#: sphinx/domains/javascript.py:134
+#: sphinx/domains/javascript.py:125
msgid "Throws"
msgstr ""
-#: sphinx/domains/javascript.py:167 sphinx/domains/python.py:498
+#: sphinx/domains/javascript.py:164 sphinx/domains/python.py:560
msgid "data"
msgstr ""
-#: sphinx/domains/javascript.py:168 sphinx/domains/python.py:504
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:566
msgid "attribute"
msgstr ""
-#: sphinx/domains/python.py:53
+#: sphinx/domains/python.py:100
msgid "Variables"
msgstr ""
-#: sphinx/domains/python.py:56
+#: sphinx/domains/python.py:104
msgid "Raises"
msgstr ""
-#: sphinx/domains/python.py:222 sphinx/domains/python.py:279
-#: sphinx/domains/python.py:291 sphinx/domains/python.py:304
+#: sphinx/domains/python.py:255 sphinx/domains/python.py:312
+#: sphinx/domains/python.py:324 sphinx/domains/python.py:337
#, python-format
msgid "%s() (in module %s)"
msgstr ""
-#: sphinx/domains/python.py:225
+#: sphinx/domains/python.py:258
#, python-format
msgid "%s (built-in variable)"
msgstr ""
-#: sphinx/domains/python.py:226 sphinx/domains/python.py:317
+#: sphinx/domains/python.py:259 sphinx/domains/python.py:350
#, python-format
msgid "%s (in module %s)"
msgstr ""
-#: sphinx/domains/python.py:242
+#: sphinx/domains/python.py:275
#, python-format
msgid "%s (built-in class)"
msgstr ""
-#: sphinx/domains/python.py:243
+#: sphinx/domains/python.py:276
#, python-format
msgid "%s (class in %s)"
msgstr ""
-#: sphinx/domains/python.py:283
+#: sphinx/domains/python.py:316
#, python-format
msgid "%s() (%s.%s method)"
msgstr ""
-#: sphinx/domains/python.py:295
+#: sphinx/domains/python.py:328
#, python-format
msgid "%s() (%s.%s static method)"
msgstr ""
-#: sphinx/domains/python.py:298
+#: sphinx/domains/python.py:331
#, python-format
msgid "%s() (%s static method)"
msgstr ""
-#: sphinx/domains/python.py:308
+#: sphinx/domains/python.py:341
#, python-format
msgid "%s() (%s.%s class method)"
msgstr ""
-#: sphinx/domains/python.py:311
+#: sphinx/domains/python.py:344
#, python-format
msgid "%s() (%s class method)"
msgstr ""
-#: sphinx/domains/python.py:321
+#: sphinx/domains/python.py:354
#, python-format
msgid "%s (%s.%s attribute)"
msgstr ""
-#: sphinx/domains/python.py:366
-msgid "Platforms: "
-msgstr ""
-
-#: sphinx/domains/python.py:372
+#: sphinx/domains/python.py:434
#, python-format
msgid "%s (module)"
msgstr ""
-#: sphinx/domains/python.py:429
+#: sphinx/domains/python.py:491
msgid "Python Module Index"
msgstr ""
-#: sphinx/domains/python.py:430
+#: sphinx/domains/python.py:492
msgid "modules"
msgstr ""
-#: sphinx/domains/python.py:475
+#: sphinx/domains/python.py:537
msgid "Deprecated"
msgstr ""
-#: sphinx/domains/python.py:500 sphinx/locale/__init__.py:162
+#: sphinx/domains/python.py:562 sphinx/locale/__init__.py:179
msgid "exception"
msgstr ""
-#: sphinx/domains/python.py:501
+#: sphinx/domains/python.py:563
msgid "method"
msgstr ""
-#: sphinx/domains/python.py:502
+#: sphinx/domains/python.py:564
msgid "class method"
msgstr ""
-#: sphinx/domains/python.py:503
+#: sphinx/domains/python.py:565
msgid "static method"
msgstr ""
-#: sphinx/domains/python.py:505 sphinx/locale/__init__.py:158
+#: sphinx/domains/python.py:567 sphinx/locale/__init__.py:175
msgid "module"
msgstr ""
-#: sphinx/domains/rst.py:53
+#: sphinx/domains/python.py:695
+msgid " (deprecated)"
+msgstr ""
+
+#: sphinx/domains/rst.py:55
#, python-format
msgid "%s (directive)"
msgstr ""
-#: sphinx/domains/rst.py:55
+#: sphinx/domains/rst.py:57
#, python-format
msgid "%s (role)"
msgstr ""
-#: sphinx/domains/rst.py:103
+#: sphinx/domains/rst.py:106
msgid "directive"
msgstr ""
-#: sphinx/domains/rst.py:104
+#: sphinx/domains/rst.py:107
msgid "role"
msgstr ""
-#: sphinx/domains/std.py:68 sphinx/domains/std.py:84
+#: sphinx/domains/std.py:70 sphinx/domains/std.py:86
#, python-format
msgid "environment variable; %s"
msgstr ""
-#: sphinx/domains/std.py:160
+#: sphinx/domains/std.py:162
#, python-format
msgid "%scommand line option; %s"
msgstr ""
-#: sphinx/domains/std.py:328
+#: sphinx/domains/std.py:393
msgid "glossary term"
msgstr ""
-#: sphinx/domains/std.py:329
+#: sphinx/domains/std.py:394
msgid "grammar token"
msgstr ""
-#: sphinx/domains/std.py:330
+#: sphinx/domains/std.py:395
msgid "reference label"
msgstr ""
-#: sphinx/domains/std.py:331
+#: sphinx/domains/std.py:396
msgid "environment variable"
msgstr ""
-#: sphinx/domains/std.py:332
+#: sphinx/domains/std.py:397
msgid "program option"
msgstr ""
-#: sphinx/domains/std.py:360 sphinx/themes/basic/genindex-single.html:11
+#: sphinx/domains/std.py:427 sphinx/themes/basic/genindex-single.html:32
#: sphinx/themes/basic/genindex-split.html:11
#: sphinx/themes/basic/genindex-split.html:14
-#: sphinx/themes/basic/genindex.html:11 sphinx/themes/basic/genindex.html:14
-#: sphinx/themes/basic/genindex.html:50 sphinx/themes/basic/layout.html:125
-#: sphinx/writers/latex.py:173
+#: sphinx/themes/basic/genindex.html:32 sphinx/themes/basic/genindex.html:35
+#: sphinx/themes/basic/genindex.html:68 sphinx/themes/basic/layout.html:134
+#: sphinx/writers/latex.py:179 sphinx/writers/texinfo.py:456
msgid "Index"
msgstr ""
-#: sphinx/domains/std.py:361
+#: sphinx/domains/std.py:428
msgid "Module Index"
msgstr ""
-#: sphinx/domains/std.py:362 sphinx/themes/basic/defindex.html:25
+#: sphinx/domains/std.py:429 sphinx/themes/basic/defindex.html:25
msgid "Search Page"
msgstr ""
-#: sphinx/ext/autodoc.py:917
+#: sphinx/ext/autodoc.py:1002
#, python-format
msgid " Bases: %s"
msgstr ""
-#: sphinx/ext/autodoc.py:950
+#: sphinx/ext/autodoc.py:1038
#, python-format
msgid "alias of :class:`%s`"
msgstr ""
@@ -398,103 +419,103 @@ msgstr ""
msgid "original entry"
msgstr ""
-#: sphinx/ext/viewcode.py:66
+#: sphinx/ext/viewcode.py:70
msgid "[source]"
msgstr ""
-#: sphinx/ext/viewcode.py:109
+#: sphinx/ext/viewcode.py:117
msgid "[docs]"
msgstr ""
-#: sphinx/ext/viewcode.py:123
+#: sphinx/ext/viewcode.py:131
msgid "Module code"
msgstr ""
-#: sphinx/ext/viewcode.py:129
+#: sphinx/ext/viewcode.py:137
#, python-format
msgid "<h1>Source code for %s</h1>"
msgstr ""
-#: sphinx/ext/viewcode.py:156
+#: sphinx/ext/viewcode.py:164
msgid "Overview: module code"
msgstr ""
-#: sphinx/ext/viewcode.py:157
+#: sphinx/ext/viewcode.py:165
msgid "<h1>All modules for which code is available</h1>"
msgstr ""
-#: sphinx/locale/__init__.py:139
+#: sphinx/locale/__init__.py:155
msgid "Attention"
msgstr ""
-#: sphinx/locale/__init__.py:140
+#: sphinx/locale/__init__.py:156
msgid "Caution"
msgstr ""
-#: sphinx/locale/__init__.py:141
+#: sphinx/locale/__init__.py:157
msgid "Danger"
msgstr ""
-#: sphinx/locale/__init__.py:142
+#: sphinx/locale/__init__.py:158
msgid "Error"
msgstr ""
-#: sphinx/locale/__init__.py:143
+#: sphinx/locale/__init__.py:159
msgid "Hint"
msgstr ""
-#: sphinx/locale/__init__.py:144
+#: sphinx/locale/__init__.py:160
msgid "Important"
msgstr ""
-#: sphinx/locale/__init__.py:145
+#: sphinx/locale/__init__.py:161
msgid "Note"
msgstr ""
-#: sphinx/locale/__init__.py:146
+#: sphinx/locale/__init__.py:162
msgid "See Also"
msgstr ""
-#: sphinx/locale/__init__.py:147
+#: sphinx/locale/__init__.py:163
msgid "Tip"
msgstr ""
-#: sphinx/locale/__init__.py:148
+#: sphinx/locale/__init__.py:164
msgid "Warning"
msgstr ""
-#: sphinx/locale/__init__.py:152
+#: sphinx/locale/__init__.py:168
#, python-format
msgid "New in version %s"
msgstr ""
-#: sphinx/locale/__init__.py:153
+#: sphinx/locale/__init__.py:169
#, python-format
msgid "Changed in version %s"
msgstr ""
-#: sphinx/locale/__init__.py:154
+#: sphinx/locale/__init__.py:170
#, python-format
msgid "Deprecated since version %s"
msgstr ""
-#: sphinx/locale/__init__.py:159
+#: sphinx/locale/__init__.py:176
msgid "keyword"
msgstr ""
-#: sphinx/locale/__init__.py:160
+#: sphinx/locale/__init__.py:177
msgid "operator"
msgstr ""
-#: sphinx/locale/__init__.py:161
+#: sphinx/locale/__init__.py:178
msgid "object"
msgstr ""
-#: sphinx/locale/__init__.py:163
+#: sphinx/locale/__init__.py:180
msgid "statement"
msgstr ""
-#: sphinx/locale/__init__.py:164
+#: sphinx/locale/__init__.py:181
msgid "built-in function"
msgstr ""
@@ -503,8 +524,8 @@ msgstr ""
msgid "Table Of Contents"
msgstr ""
-#: sphinx/themes/agogo/layout.html:49 sphinx/themes/basic/layout.html:128
-#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:14
+#: sphinx/themes/agogo/layout.html:49 sphinx/themes/basic/layout.html:137
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:20
msgid "Search"
msgstr ""
@@ -552,15 +573,15 @@ msgstr ""
msgid "all functions, classes, terms"
msgstr ""
-#: sphinx/themes/basic/genindex-single.html:14
+#: sphinx/themes/basic/genindex-single.html:35
#, python-format
msgid "Index &ndash; %(key)s"
msgstr ""
-#: sphinx/themes/basic/genindex-single.html:46
+#: sphinx/themes/basic/genindex-single.html:63
#: sphinx/themes/basic/genindex-split.html:24
#: sphinx/themes/basic/genindex-split.html:38
-#: sphinx/themes/basic/genindex.html:56
+#: sphinx/themes/basic/genindex.html:74
msgid "Full index on one page"
msgstr ""
@@ -572,39 +593,39 @@ msgstr ""
msgid "can be huge"
msgstr ""
-#: sphinx/themes/basic/layout.html:23
+#: sphinx/themes/basic/layout.html:29
msgid "Navigation"
msgstr ""
-#: sphinx/themes/basic/layout.html:113
+#: sphinx/themes/basic/layout.html:122
#, python-format
msgid "Search within %(docstitle)s"
msgstr ""
-#: sphinx/themes/basic/layout.html:122
+#: sphinx/themes/basic/layout.html:131
msgid "About these documents"
msgstr ""
-#: sphinx/themes/basic/layout.html:131
+#: sphinx/themes/basic/layout.html:140
msgid "Copyright"
msgstr ""
-#: sphinx/themes/basic/layout.html:180
+#: sphinx/themes/basic/layout.html:189
#, python-format
msgid "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
msgstr ""
-#: sphinx/themes/basic/layout.html:182
+#: sphinx/themes/basic/layout.html:191
#, python-format
msgid "&copy; Copyright %(copyright)s."
msgstr ""
-#: sphinx/themes/basic/layout.html:186
+#: sphinx/themes/basic/layout.html:195
#, python-format
msgid "Last updated on %(last_updated)s."
msgstr ""
-#: sphinx/themes/basic/layout.html:189
+#: sphinx/themes/basic/layout.html:198
#, python-format
msgid ""
"Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
@@ -632,13 +653,13 @@ msgstr ""
msgid "next chapter"
msgstr ""
-#: sphinx/themes/basic/search.html:18
+#: sphinx/themes/basic/search.html:24
msgid ""
"Please activate JavaScript to enable the search\n"
" functionality."
msgstr ""
-#: sphinx/themes/basic/search.html:23
+#: sphinx/themes/basic/search.html:29
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"
@@ -646,16 +667,15 @@ msgid ""
" containing fewer words won't appear in the result list."
msgstr ""
-#: sphinx/themes/basic/search.html:30
+#: sphinx/themes/basic/search.html:36
msgid "search"
msgstr ""
-#: sphinx/themes/basic/search.html:34
-#: sphinx/themes/basic/static/searchtools.js:489
+#: sphinx/themes/basic/search.html:40
msgid "Search Results"
msgstr ""
-#: sphinx/themes/basic/search.html:36
+#: sphinx/themes/basic/search.html:42
msgid "Your search did not match any results."
msgstr ""
@@ -695,12 +715,12 @@ msgstr ""
msgid "Other changes"
msgstr ""
-#: sphinx/themes/basic/static/doctools.js:154 sphinx/writers/html.py:482
-#: sphinx/writers/html.py:487
+#: sphinx/themes/basic/static/doctools.js:154 sphinx/writers/html.py:504
+#: sphinx/writers/html.py:510
msgid "Permalink to this headline"
msgstr ""
-#: sphinx/themes/basic/static/doctools.js:160 sphinx/writers/html.py:87
+#: sphinx/themes/basic/static/doctools.js:160 sphinx/writers/html.py:92
msgid "Permalink to this definition"
msgstr ""
@@ -708,35 +728,12 @@ msgstr ""
msgid "Hide Search Matches"
msgstr ""
-#: sphinx/themes/basic/static/searchtools.js:285
-msgid "Searching"
-msgstr ""
-
-#: sphinx/themes/basic/static/searchtools.js:290
-msgid "Preparing search..."
-msgstr ""
-
-#: sphinx/themes/basic/static/searchtools.js:364
-msgid ", in "
-msgstr ""
-
-#: sphinx/themes/basic/static/searchtools.js:491
-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/themes/basic/static/searchtools.js:493
-#, python-format
-msgid "Search finished, found %s page(s) matching the search query."
-msgstr ""
-
-#: sphinx/themes/default/static/sidebar.js:66
+#: sphinx/themes/default/static/sidebar.js:69
msgid "Expand sidebar"
msgstr ""
-#: sphinx/themes/default/static/sidebar.js:79
-#: sphinx/themes/default/static/sidebar.js:106
+#: sphinx/themes/default/static/sidebar.js:82
+#: sphinx/themes/default/static/sidebar.js:110
msgid "Collapse sidebar"
msgstr ""
@@ -744,23 +741,24 @@ msgstr ""
msgid "Contents"
msgstr ""
-#: sphinx/writers/latex.py:171
+#: sphinx/writers/latex.py:177
msgid "Release"
msgstr ""
-#: sphinx/writers/latex.py:572 sphinx/writers/manpage.py:178
+#: sphinx/writers/latex.py:594 sphinx/writers/manpage.py:182
+#: sphinx/writers/texinfo.py:589
msgid "Footnotes"
msgstr ""
-#: sphinx/writers/latex.py:641
+#: sphinx/writers/latex.py:676
msgid "continued from previous page"
msgstr ""
-#: sphinx/writers/latex.py:646
+#: sphinx/writers/latex.py:681
msgid "Continued on next page"
msgstr ""
-#: sphinx/writers/text.py:422
+#: sphinx/writers/text.py:437
msgid "[image]"
msgstr ""
diff --git a/sphinx/locale/sv/LC_MESSAGES/sphinx.js b/sphinx/locale/sv/LC_MESSAGES/sphinx.js
new file mode 100644
index 00000000..15821aba
--- /dev/null
+++ b/sphinx/locale/sv/LC_MESSAGES/sphinx.js
@@ -0,0 +1 @@
+Documentation.addTranslations({"locale": "sv", "plural_expr": "(n != 1)", "messages": {"Hide Search Matches": "D\u00f6lj S\u00f6kresultat", "Permalink to this definition": "Permalink till denna definition", "Expand sidebar": "Expandera sidolist", "Permalink to this headline": "Permalink till denna rubrik", "Collapse sidebar": "D\u00f6lj sidolist"}}); \ No newline at end of file
diff --git a/sphinx/locale/sv/LC_MESSAGES/sphinx.mo b/sphinx/locale/sv/LC_MESSAGES/sphinx.mo
new file mode 100644
index 00000000..11b18023
--- /dev/null
+++ b/sphinx/locale/sv/LC_MESSAGES/sphinx.mo
Binary files differ
diff --git a/sphinx/locale/sv/LC_MESSAGES/sphinx.po b/sphinx/locale/sv/LC_MESSAGES/sphinx.po
new file mode 100644
index 00000000..9967bdd7
--- /dev/null
+++ b/sphinx/locale/sv/LC_MESSAGES/sphinx.po
@@ -0,0 +1,766 @@
+
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2011-09-21 10:06+0200\n"
+"PO-Revision-Date: 2011-09-21 10:14+0200\n"
+"Last-Translator: Henrik Holmboe <henrik@holmboe.se>\n"
+"Language-Team: \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.6\n"
+
+#: sphinx/config.py:81
+#, python-format
+msgid "%s %s documentation"
+msgstr ""
+
+#: sphinx/environment.py:119 sphinx/writers/latex.py:190
+#: sphinx/writers/manpage.py:67 sphinx/writers/texinfo.py:203
+#, python-format
+msgid "%B %d, %Y"
+msgstr "%B %d, %Y"
+
+#: sphinx/environment.py:1625
+#, python-format
+msgid "see %s"
+msgstr "se %s"
+
+#: sphinx/environment.py:1628
+#, python-format
+msgid "see also %s"
+msgstr "se även %s"
+
+#: sphinx/roles.py:175
+#, python-format
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr "Python Enhancement Proposals; PEP %s"
+
+#: sphinx/builders/changes.py:73
+msgid "Builtins"
+msgstr "Inbyggda"
+
+#: sphinx/builders/changes.py:75
+msgid "Module level"
+msgstr "Modulnivå"
+
+#: sphinx/builders/html.py:274
+#, python-format
+msgid "%b %d, %Y"
+msgstr "%b %d, %Y"
+
+#: sphinx/builders/html.py:293 sphinx/themes/basic/defindex.html:30
+msgid "General Index"
+msgstr "Huvudindex"
+
+#: sphinx/builders/html.py:293
+msgid "index"
+msgstr "index"
+
+#: sphinx/builders/html.py:353
+msgid "next"
+msgstr "nästa"
+
+#: sphinx/builders/html.py:362
+msgid "previous"
+msgstr "föregående"
+
+#: sphinx/builders/latex.py:141 sphinx/builders/texinfo.py:196
+msgid " (in "
+msgstr "(i "
+
+#: sphinx/directives/other.py:136
+msgid "Section author: "
+msgstr "Sektionsförfattare"
+
+#: sphinx/directives/other.py:138
+msgid "Module author: "
+msgstr "Modulförfattare"
+
+#: sphinx/directives/other.py:140
+msgid "Code author: "
+msgstr "Källkodsförfattare"
+
+#: sphinx/directives/other.py:142
+msgid "Author: "
+msgstr "Upphovsman:"
+
+#: sphinx/directives/other.py:215
+msgid "See also"
+msgstr "Se även"
+
+#: sphinx/domains/__init__.py:244
+#, python-format
+msgid "%s %s"
+msgstr "%s %s"
+
+#: sphinx/domains/c.py:51 sphinx/domains/python.py:95
+msgid "Parameters"
+msgstr "Parametrar"
+
+#: sphinx/domains/c.py:54 sphinx/domains/javascript.py:128
+#: sphinx/domains/python.py:107
+msgid "Returns"
+msgstr "Returnerar"
+
+#: sphinx/domains/c.py:56 sphinx/domains/python.py:109
+msgid "Return type"
+msgstr "Returtyp"
+
+#: sphinx/domains/c.py:141
+#, python-format
+msgid "%s (C function)"
+msgstr "%s (C-funktion)"
+
+#: sphinx/domains/c.py:143
+#, python-format
+msgid "%s (C member)"
+msgstr "%s (C-medlem)"
+
+#: sphinx/domains/c.py:145
+#, python-format
+msgid "%s (C macro)"
+msgstr "%s (C-makro)"
+
+#: sphinx/domains/c.py:147
+#, python-format
+msgid "%s (C type)"
+msgstr "%s (C-typ)"
+
+#: sphinx/domains/c.py:149
+#, python-format
+msgid "%s (C variable)"
+msgstr "%s (C-variabel)"
+
+#: sphinx/domains/c.py:204 sphinx/domains/cpp.py:1060
+#: sphinx/domains/javascript.py:162 sphinx/domains/python.py:559
+msgid "function"
+msgstr "funktion"
+
+#: sphinx/domains/c.py:205 sphinx/domains/cpp.py:1061
+msgid "member"
+msgstr "medlem"
+
+#: sphinx/domains/c.py:206
+msgid "macro"
+msgstr "makro"
+
+#: sphinx/domains/c.py:207 sphinx/domains/cpp.py:1062
+msgid "type"
+msgstr "typ"
+
+#: sphinx/domains/c.py:208
+msgid "variable"
+msgstr "variabel"
+
+#: sphinx/domains/cpp.py:904
+#, python-format
+msgid "%s (C++ class)"
+msgstr "%s (C++-klass)"
+
+#: sphinx/domains/cpp.py:919
+#, python-format
+msgid "%s (C++ type)"
+msgstr "%s (C++-typ)"
+
+#: sphinx/domains/cpp.py:938
+#, python-format
+msgid "%s (C++ member)"
+msgstr "%s (C++-medlem)"
+
+#: sphinx/domains/cpp.py:990
+#, python-format
+msgid "%s (C++ function)"
+msgstr "%s (C++-funktion)"
+
+#: sphinx/domains/cpp.py:1059 sphinx/domains/javascript.py:163
+#: sphinx/domains/python.py:561
+msgid "class"
+msgstr "klass"
+
+#: sphinx/domains/javascript.py:106 sphinx/domains/python.py:254
+#, python-format
+msgid "%s() (built-in function)"
+msgstr "%s() (inbyggd funktion)"
+
+#: sphinx/domains/javascript.py:107 sphinx/domains/python.py:318
+#, python-format
+msgid "%s() (%s method)"
+msgstr "%s() (%s metod)"
+
+#: sphinx/domains/javascript.py:109
+#, python-format
+msgid "%s() (class)"
+msgstr "%s() (klass)"
+
+#: sphinx/domains/javascript.py:111
+#, python-format
+msgid "%s (global variable or constant)"
+msgstr "%s (global variabel eller konstant)"
+
+#: sphinx/domains/javascript.py:113 sphinx/domains/python.py:356
+#, python-format
+msgid "%s (%s attribute)"
+msgstr "%s (%s attribut)"
+
+#: sphinx/domains/javascript.py:122
+msgid "Arguments"
+msgstr "Argument"
+
+#: sphinx/domains/javascript.py:125
+msgid "Throws"
+msgstr "Kastar"
+
+#: sphinx/domains/javascript.py:164 sphinx/domains/python.py:560
+msgid "data"
+msgstr "data"
+
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:566
+msgid "attribute"
+msgstr "attribut"
+
+#: sphinx/domains/python.py:100
+msgid "Variables"
+msgstr "Variabler"
+
+#: sphinx/domains/python.py:104
+msgid "Raises"
+msgstr "Väcker"
+
+#: sphinx/domains/python.py:255 sphinx/domains/python.py:312
+#: sphinx/domains/python.py:324 sphinx/domains/python.py:337
+#, python-format
+msgid "%s() (in module %s)"
+msgstr "%s() (i modul %s)"
+
+#: sphinx/domains/python.py:258
+#, python-format
+msgid "%s (built-in variable)"
+msgstr "%s (inbyggd variabel)"
+
+#: sphinx/domains/python.py:259 sphinx/domains/python.py:350
+#, python-format
+msgid "%s (in module %s)"
+msgstr "%s (i modul %s)"
+
+#: sphinx/domains/python.py:275
+#, python-format
+msgid "%s (built-in class)"
+msgstr "%s (inbyggd klass)"
+
+#: sphinx/domains/python.py:276
+#, python-format
+msgid "%s (class in %s)"
+msgstr "%s (klass i %s)"
+
+#: sphinx/domains/python.py:316
+#, python-format
+msgid "%s() (%s.%s method)"
+msgstr "%s() (%s.%s metod)"
+
+#: sphinx/domains/python.py:328
+#, python-format
+msgid "%s() (%s.%s static method)"
+msgstr "%s() (%s.%s statisk metod)"
+
+#: sphinx/domains/python.py:331
+#, python-format
+msgid "%s() (%s static method)"
+msgstr "%s() (%s statisk metod)"
+
+#: sphinx/domains/python.py:341
+#, python-format
+msgid "%s() (%s.%s class method)"
+msgstr "%s() (%s.%s klassmetod)"
+
+#: sphinx/domains/python.py:344
+#, python-format
+msgid "%s() (%s class method)"
+msgstr "%s() (%s klassmetod)"
+
+#: sphinx/domains/python.py:354
+#, python-format
+msgid "%s (%s.%s attribute)"
+msgstr "%s (%s.%s attribut)"
+
+#: sphinx/domains/python.py:434
+#, python-format
+msgid "%s (module)"
+msgstr "%s (modul)"
+
+#: sphinx/domains/python.py:491
+msgid "Python Module Index"
+msgstr "Python Modulindex"
+
+#: sphinx/domains/python.py:492
+msgid "modules"
+msgstr "moduler"
+
+#: sphinx/domains/python.py:537
+msgid "Deprecated"
+msgstr "Ersatt"
+
+#: sphinx/domains/python.py:562 sphinx/locale/__init__.py:179
+msgid "exception"
+msgstr "undantag"
+
+#: sphinx/domains/python.py:563
+msgid "method"
+msgstr "metod"
+
+#: sphinx/domains/python.py:564
+msgid "class method"
+msgstr "klassmetod"
+
+#: sphinx/domains/python.py:565
+msgid "static method"
+msgstr "statisk metod"
+
+#: sphinx/domains/python.py:567 sphinx/locale/__init__.py:175
+msgid "module"
+msgstr "modul"
+
+#: sphinx/domains/python.py:695
+#, fuzzy
+msgid " (deprecated)"
+msgstr " (ersatt)"
+
+#: sphinx/domains/rst.py:55
+#, python-format
+msgid "%s (directive)"
+msgstr "%s (direktiv)"
+
+#: sphinx/domains/rst.py:57
+#, python-format
+msgid "%s (role)"
+msgstr "%s (roll)"
+
+#: sphinx/domains/rst.py:106
+msgid "directive"
+msgstr "direktiv"
+
+#: sphinx/domains/rst.py:107
+msgid "role"
+msgstr "roll"
+
+#: sphinx/domains/std.py:70 sphinx/domains/std.py:86
+#, python-format
+msgid "environment variable; %s"
+msgstr "miljövariabel; %s"
+
+#: sphinx/domains/std.py:162
+#, python-format
+msgid "%scommand line option; %s"
+msgstr "%skommandorad växel; %s"
+
+#: sphinx/domains/std.py:393
+msgid "glossary term"
+msgstr "ordlista"
+
+#: sphinx/domains/std.py:394
+msgid "grammar token"
+msgstr "grammatisk token"
+
+#: sphinx/domains/std.py:395
+msgid "reference label"
+msgstr "referensetikett"
+
+#: sphinx/domains/std.py:396
+msgid "environment variable"
+msgstr "miljövariabel"
+
+#: sphinx/domains/std.py:397
+msgid "program option"
+msgstr "programväxel"
+
+#: sphinx/domains/std.py:427 sphinx/themes/basic/genindex-single.html:32
+#: sphinx/themes/basic/genindex-split.html:11
+#: sphinx/themes/basic/genindex-split.html:14
+#: sphinx/themes/basic/genindex.html:32 sphinx/themes/basic/genindex.html:35
+#: sphinx/themes/basic/genindex.html:68 sphinx/themes/basic/layout.html:134
+#: sphinx/writers/latex.py:179 sphinx/writers/texinfo.py:456
+msgid "Index"
+msgstr "Index"
+
+#: sphinx/domains/std.py:428
+msgid "Module Index"
+msgstr "Modulindex"
+
+#: sphinx/domains/std.py:429 sphinx/themes/basic/defindex.html:25
+msgid "Search Page"
+msgstr "Söksida"
+
+#: sphinx/ext/autodoc.py:1002
+#, python-format
+msgid " Bases: %s"
+msgstr " Baserad: %s"
+
+#: sphinx/ext/autodoc.py:1038
+#, python-format
+msgid "alias of :class:`%s`"
+msgstr "alias för :class:`%s`"
+
+#: sphinx/ext/todo.py:41
+msgid "Todo"
+msgstr "Att göra"
+
+#: sphinx/ext/todo.py:109
+#, python-format
+msgid "(The <<original entry>> is located in %s, line %d.)"
+msgstr "(<<Ursprunget>> finns i %s, på rad %d.)"
+
+#: sphinx/ext/todo.py:117
+msgid "original entry"
+msgstr "ursprungsvärde"
+
+#: sphinx/ext/viewcode.py:70
+msgid "[source]"
+msgstr "[source]"
+
+#: sphinx/ext/viewcode.py:117
+msgid "[docs]"
+msgstr "[docs]"
+
+#: sphinx/ext/viewcode.py:131
+msgid "Module code"
+msgstr "Modulkällkod"
+
+#: sphinx/ext/viewcode.py:137
+#, python-format
+msgid "<h1>Source code for %s</h1>"
+msgstr "<h1>Källkod för %s</h1>"
+
+#: sphinx/ext/viewcode.py:164
+msgid "Overview: module code"
+msgstr "Översikt: modulkällkod"
+
+#: sphinx/ext/viewcode.py:165
+msgid "<h1>All modules for which code is available</h1>"
+msgstr "<h1>Alla moduler där källkod finns</h1>"
+
+#: sphinx/locale/__init__.py:155
+msgid "Attention"
+msgstr "Uppmärksamma"
+
+#: sphinx/locale/__init__.py:156
+msgid "Caution"
+msgstr "Varning"
+
+#: sphinx/locale/__init__.py:157
+msgid "Danger"
+msgstr "Risk"
+
+#: sphinx/locale/__init__.py:158
+msgid "Error"
+msgstr "Fel"
+
+#: sphinx/locale/__init__.py:159
+msgid "Hint"
+msgstr "Råd"
+
+#: sphinx/locale/__init__.py:160
+msgid "Important"
+msgstr "Viktigt"
+
+#: sphinx/locale/__init__.py:161
+msgid "Note"
+msgstr "Observera"
+
+#: sphinx/locale/__init__.py:162
+msgid "See Also"
+msgstr "Se även"
+
+#: sphinx/locale/__init__.py:163
+msgid "Tip"
+msgstr "Tips"
+
+#: sphinx/locale/__init__.py:164
+msgid "Warning"
+msgstr "Varning"
+
+#: sphinx/locale/__init__.py:168
+#, python-format
+msgid "New in version %s"
+msgstr "Nyheter i version %s"
+
+#: sphinx/locale/__init__.py:169
+#, python-format
+msgid "Changed in version %s"
+msgstr "Förändrat i version %s"
+
+#: sphinx/locale/__init__.py:170
+#, python-format
+msgid "Deprecated since version %s"
+msgstr "Ersatt sedan version %s"
+
+#: sphinx/locale/__init__.py:176
+msgid "keyword"
+msgstr "nyckelord"
+
+#: sphinx/locale/__init__.py:177
+msgid "operator"
+msgstr "operator"
+
+#: sphinx/locale/__init__.py:178
+msgid "object"
+msgstr "objekt"
+
+#: sphinx/locale/__init__.py:180
+msgid "statement"
+msgstr "uttryck"
+
+#: sphinx/locale/__init__.py:181
+msgid "built-in function"
+msgstr "inbyggda funktioner"
+
+#: sphinx/themes/agogo/layout.html:45 sphinx/themes/basic/globaltoc.html:10
+#: sphinx/themes/basic/localtoc.html:11
+msgid "Table Of Contents"
+msgstr "Innehållsförteckning"
+
+#: sphinx/themes/agogo/layout.html:49 sphinx/themes/basic/layout.html:137
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:20
+msgid "Search"
+msgstr "Sök"
+
+#: sphinx/themes/agogo/layout.html:52 sphinx/themes/basic/searchbox.html:15
+msgid "Go"
+msgstr "Gå"
+
+#: sphinx/themes/agogo/layout.html:57 sphinx/themes/basic/searchbox.html:20
+msgid "Enter search terms or a module, class or function name."
+msgstr "Ange sökord eller modul-, klass- eller funktionsnamn."
+
+#: sphinx/themes/agogo/layout.html:78 sphinx/themes/basic/sourcelink.html:14
+msgid "Show Source"
+msgstr "Visa källfil"
+
+#: sphinx/themes/basic/defindex.html:11
+msgid "Overview"
+msgstr "Översikt"
+
+#: sphinx/themes/basic/defindex.html:20
+msgid "Indices and tables:"
+msgstr "Index och tabeller"
+
+#: sphinx/themes/basic/defindex.html:23
+msgid "Complete Table of Contents"
+msgstr "Komplett Innehållsförteckning"
+
+#: sphinx/themes/basic/defindex.html:24
+msgid "lists all sections and subsections"
+msgstr "lista över alla paragrafer och underparagrafer"
+
+#: sphinx/themes/basic/defindex.html:26
+msgid "search this documentation"
+msgstr "sök i det här dokumentet"
+
+#: sphinx/themes/basic/defindex.html:28
+msgid "Global Module Index"
+msgstr "Global Modulindex"
+
+#: sphinx/themes/basic/defindex.html:29
+msgid "quick access to all modules"
+msgstr "genväg till alla moduler"
+
+#: sphinx/themes/basic/defindex.html:31
+msgid "all functions, classes, terms"
+msgstr "alla funktioner, klasser, villkor"
+
+#: sphinx/themes/basic/genindex-single.html:35
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr "Index &ndash; %(key)s"
+
+#: sphinx/themes/basic/genindex-single.html:63
+#: sphinx/themes/basic/genindex-split.html:24
+#: sphinx/themes/basic/genindex-split.html:38
+#: sphinx/themes/basic/genindex.html:74
+msgid "Full index on one page"
+msgstr "Hela innehållsförteckningen på en sida"
+
+#: sphinx/themes/basic/genindex-split.html:16
+msgid "Index pages by letter"
+msgstr "Innehållsförteckning per inledande bokstav"
+
+#: sphinx/themes/basic/genindex-split.html:25
+msgid "can be huge"
+msgstr "kan bli stort"
+
+#: sphinx/themes/basic/layout.html:29
+msgid "Navigation"
+msgstr "Navigation"
+
+#: sphinx/themes/basic/layout.html:122
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr "Sök bland %(docstitle)s"
+
+#: sphinx/themes/basic/layout.html:131
+msgid "About these documents"
+msgstr "Om dessa dokument"
+
+#: sphinx/themes/basic/layout.html:140
+msgid "Copyright"
+msgstr "Copyright"
+
+#: sphinx/themes/basic/layout.html:189
+#, python-format
+msgid "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
+msgstr "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
+
+#: sphinx/themes/basic/layout.html:191
+#, python-format
+msgid "&copy; Copyright %(copyright)s."
+msgstr "&copy; Copyright %(copyright)s."
+
+#: sphinx/themes/basic/layout.html:195
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr "Senast uppdaterad %(last_updated)s."
+
+#: sphinx/themes/basic/layout.html:198
+#, python-format
+msgid ""
+"Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+"Skapad med <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+
+#: sphinx/themes/basic/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr "Sök %(docstitle)s"
+
+#: sphinx/themes/basic/relations.html:11
+msgid "Previous topic"
+msgstr "Föregående titel"
+
+#: sphinx/themes/basic/relations.html:13
+msgid "previous chapter"
+msgstr "Föregående kapitel"
+
+#: sphinx/themes/basic/relations.html:16
+msgid "Next topic"
+msgstr "Nästa titel"
+
+#: sphinx/themes/basic/relations.html:18
+msgid "next chapter"
+msgstr "Nästa kapitel"
+
+#: sphinx/themes/basic/search.html:24
+msgid ""
+"Please activate JavaScript to enable the search\n"
+" functionality."
+msgstr "Var god aktivera JavaScript för sökfunktionalitet."
+
+#: sphinx/themes/basic/search.html:29
+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 ""
+"Här kan du söka bland dessa dokument. Ange sökord nedan och klicka "
+"\"sök\".\n"
+" Sökningen måste träffa på samtliga angivna sökord."
+
+#: sphinx/themes/basic/search.html:36
+msgid "search"
+msgstr "sök"
+
+#: sphinx/themes/basic/search.html:40
+msgid "Search Results"
+msgstr "Sökresultat"
+
+#: sphinx/themes/basic/search.html:42
+msgid "Your search did not match any results."
+msgstr "Din sökning gav inga resultat."
+
+#: sphinx/themes/basic/searchbox.html:12
+msgid "Quick search"
+msgstr "Snabbsök"
+
+#: sphinx/themes/basic/sourcelink.html:11
+msgid "This Page"
+msgstr "Denna Sida"
+
+#: sphinx/themes/basic/changes/frameset.html:5
+#: sphinx/themes/basic/changes/versionchanges.html:12
+#, python-format
+msgid "Changes in Version %(version)s &mdash; %(docstitle)s"
+msgstr "Förändringar i Version %(version)s &mdash; %(docstitle)s"
+
+#: sphinx/themes/basic/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &mdash; %(docstitle)s"
+msgstr "%(filename)s &mdash; %(docstitle)s"
+
+#: sphinx/themes/basic/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr "Automatiskt genererad lista över förändringar i version %(version)s"
+
+#: sphinx/themes/basic/changes/versionchanges.html:18
+msgid "Library changes"
+msgstr "Förändringar i bibliotek"
+
+#: sphinx/themes/basic/changes/versionchanges.html:23
+msgid "C API changes"
+msgstr "Förändringar i C-API"
+
+#: sphinx/themes/basic/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr "Övriga förändringar"
+
+#: sphinx/themes/basic/static/doctools.js:154 sphinx/writers/html.py:504
+#: sphinx/writers/html.py:510
+msgid "Permalink to this headline"
+msgstr "Permalink till denna rubrik"
+
+#: sphinx/themes/basic/static/doctools.js:160 sphinx/writers/html.py:92
+msgid "Permalink to this definition"
+msgstr "Permalink till denna definition"
+
+#: sphinx/themes/basic/static/doctools.js:189
+msgid "Hide Search Matches"
+msgstr "Dölj Sökresultat"
+
+#: sphinx/themes/default/static/sidebar.js:69
+msgid "Expand sidebar"
+msgstr "Expandera sidolist"
+
+#: sphinx/themes/default/static/sidebar.js:82
+#: sphinx/themes/default/static/sidebar.js:110
+msgid "Collapse sidebar"
+msgstr "Dölj sidolist"
+
+#: sphinx/themes/haiku/layout.html:26
+msgid "Contents"
+msgstr "Innehåll"
+
+#: sphinx/writers/latex.py:177
+msgid "Release"
+msgstr "Utgåva"
+
+#: sphinx/writers/latex.py:594 sphinx/writers/manpage.py:182
+#: sphinx/writers/texinfo.py:589
+msgid "Footnotes"
+msgstr "Fotnoter"
+
+#: sphinx/writers/latex.py:676
+msgid "continued from previous page"
+msgstr "fortsättning från föregående sida"
+
+#: sphinx/writers/latex.py:681
+msgid "Continued on next page"
+msgstr "Fortsätter på nästa sida"
+
+#: sphinx/writers/text.py:437
+msgid "[image]"
+msgstr "[image]"
+
diff --git a/sphinx/locale/tr/LC_MESSAGES/sphinx.js b/sphinx/locale/tr/LC_MESSAGES/sphinx.js
index 3cb91177..4ba20a32 100644
--- a/sphinx/locale/tr/LC_MESSAGES/sphinx.js
+++ b/sphinx/locale/tr/LC_MESSAGES/sphinx.js
@@ -1 +1 @@
-Documentation.addTranslations({"locale": "tr", "plural_expr": "0", "messages": {"Search Results": "Arama Sonu\u00e7lar\u0131", "Preparing search...": "Aramaya haz\u0131rlan\u0131yor...", "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "Arama sonucunda hi\u00e7bir belge bulunamad\u0131. B\u00fct\u00fcn kelimeleri do\u011fru yazd\u0131\u011f\u0131n\u0131zdan ve gereken kategorileri se\u00e7ti\u011finizden emin olun.", "Search finished, found %s page(s) matching the search query.": "Arama sonu\u00e7land\u0131, aramayla e\u015fle\u015fen %s sayfa bulundu.", ", in ": ", \u015funun i\u00e7inde: ", "Expand sidebar": "Yan \u00e7ubu\u011fu geni\u015flet", "Permalink to this headline": "Bu ba\u015fl\u0131\u011f\u0131n kal\u0131c\u0131 ba\u011flant\u0131s\u0131", "Searching": "Ar\u0131yor", "Collapse sidebar": "Yan \u00e7ubu\u011fu daralt", "Permalink to this definition": "Bu tan\u0131m\u0131n kal\u0131c\u0131 ba\u011flant\u0131s\u0131", "Hide Search Matches": "Arama Sonu\u00e7lar\u0131n\u0131 Gizle"}}); \ No newline at end of file
+Documentation.addTranslations({"locale": "tr", "plural_expr": "0", "messages": {"Hide Search Matches": "Arama Sonu\u00e7lar\u0131n\u0131 Gizle", "Permalink to this definition": "Bu tan\u0131m\u0131n kal\u0131c\u0131 ba\u011flant\u0131s\u0131", "Expand sidebar": "Yan \u00e7ubu\u011fu geni\u015flet", "Permalink to this headline": "Bu ba\u015fl\u0131\u011f\u0131n kal\u0131c\u0131 ba\u011flant\u0131s\u0131", "Collapse sidebar": "Yan \u00e7ubu\u011fu daralt"}}); \ No newline at end of file
diff --git a/sphinx/locale/tr/LC_MESSAGES/sphinx.mo b/sphinx/locale/tr/LC_MESSAGES/sphinx.mo
index 5054199c..812b7cd9 100644
--- a/sphinx/locale/tr/LC_MESSAGES/sphinx.mo
+++ b/sphinx/locale/tr/LC_MESSAGES/sphinx.mo
Binary files differ
diff --git a/sphinx/locale/tr/LC_MESSAGES/sphinx.po b/sphinx/locale/tr/LC_MESSAGES/sphinx.po
index e1e5c173..bf5fd568 100644
--- a/sphinx/locale/tr/LC_MESSAGES/sphinx.po
+++ b/sphinx/locale/tr/LC_MESSAGES/sphinx.po
@@ -1,412 +1,407 @@
# Turkish translations for Sphinx.
-# Copyright (C) 2009 ORGANIZATION
+# Copyright (C) 2011 ORGANIZATION
# This file is distributed under the same license as the Sphinx project.
-# FIRST AUTHOR <EMAIL@ADDRESS>, 2009.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
#
msgid ""
msgstr ""
-"Project-Id-Version: Sphinx 0.6.2+/6b02a19ccf31\n"
+"Project-Id-Version: Sphinx 1.1pre/339c7a794c1a\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2009-08-06 22:48+0200\n"
-"PO-Revision-Date: 2010-05-28 10:18+0200\n"
+"POT-Creation-Date: 2011-09-21 10:06+0200\n"
+"PO-Revision-Date: 2011-09-21 10:14+0200\n"
"Last-Translator: Firat Ozgul <ozgulfirat@gmail.com>\n"
-"Language-Team: Turkish <kistihza@yahoo.com>\n"
+"Language-Team: tr <LL@li.org>\n"
"Plural-Forms: nplurals=1; plural=0\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"
+"Generated-By: Babel 0.9.6\n"
-#: sphinx/environment.py:106
-#: sphinx/writers/latex.py:184
-#: sphinx/writers/manpage.py:67
+#: sphinx/config.py:81
+#, python-format
+msgid "%s %s documentation"
+msgstr ""
+
+#: sphinx/environment.py:119 sphinx/writers/latex.py:190
+#: sphinx/writers/manpage.py:67 sphinx/writers/texinfo.py:203
#, python-format
msgid "%B %d, %Y"
msgstr "%d %B %Y"
-#: sphinx/roles.py:174
+#: sphinx/environment.py:1625
+#, python-format
+msgid "see %s"
+msgstr "bkz. %s"
+
+#: sphinx/environment.py:1628
+#, python-format
+msgid "see also %s"
+msgstr "ayrıca bkz. %s"
+
+#: sphinx/roles.py:175
#, python-format
-msgid "Python Enhancement Proposals!PEP %s"
-msgstr "Python'u İyileştirme Önerileri!PEP %s"
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr "Python'u İyileştirme Önerileri; PEP %s"
-#: sphinx/builders/changes.py:72
+#: sphinx/builders/changes.py:73
msgid "Builtins"
msgstr "Gömülüler"
-#: sphinx/builders/changes.py:74
+#: sphinx/builders/changes.py:75
msgid "Module level"
msgstr "Modül düzeyi"
-#: sphinx/builders/html.py:266
+#: sphinx/builders/html.py:274
#, python-format
msgid "%b %d, %Y"
msgstr "%d %b %Y"
-#: sphinx/builders/html.py:285
-#: sphinx/themes/basic/defindex.html:30
+#: sphinx/builders/html.py:293 sphinx/themes/basic/defindex.html:30
msgid "General Index"
msgstr "Genel Dizin"
-#: sphinx/builders/html.py:285
+#: sphinx/builders/html.py:293
msgid "index"
msgstr "dizin"
-#: sphinx/builders/html.py:345
+#: sphinx/builders/html.py:353
msgid "next"
msgstr "sonraki"
-#: sphinx/builders/html.py:354
+#: sphinx/builders/html.py:362
msgid "previous"
msgstr "önceki"
-#: sphinx/builders/latex.py:151
+#: sphinx/builders/latex.py:141 sphinx/builders/texinfo.py:196
msgid " (in "
msgstr " (şunun içinde: "
-#: sphinx/directives/other.py:127
+#: sphinx/directives/other.py:136
msgid "Section author: "
msgstr "Bölümü yazan: "
-#: sphinx/directives/other.py:129
+#: sphinx/directives/other.py:138
msgid "Module author: "
msgstr "Modülü yazan: "
-#: sphinx/directives/other.py:131
+#: sphinx/directives/other.py:140
msgid "Code author: "
msgstr "Kodu yazan: "
-#: sphinx/directives/other.py:133
+#: sphinx/directives/other.py:142
msgid "Author: "
msgstr "Yazan: "
-#: sphinx/directives/other.py:238
+#: sphinx/directives/other.py:215
msgid "See also"
msgstr "Ayrıca bkz."
-#: sphinx/domains/__init__.py:253
+#: sphinx/domains/__init__.py:244
#, python-format
msgid "%s %s"
msgstr "%s %s"
-#: sphinx/domains/c.py:51
-#: sphinx/domains/python.py:49
+#: sphinx/domains/c.py:51 sphinx/domains/python.py:95
msgid "Parameters"
msgstr "Parametreler"
-#: sphinx/domains/c.py:54
-#: sphinx/domains/javascript.py:137
-#: sphinx/domains/python.py:59
+#: sphinx/domains/c.py:54 sphinx/domains/javascript.py:128
+#: sphinx/domains/python.py:107
msgid "Returns"
-msgstr "Şunu döndürür:"
+msgstr "Dönüş değeri:"
-#: sphinx/domains/c.py:56
-#: sphinx/domains/python.py:61
+#: sphinx/domains/c.py:56 sphinx/domains/python.py:109
msgid "Return type"
msgstr "Dönüş tipi"
-#: sphinx/domains/c.py:133
+#: sphinx/domains/c.py:141
#, python-format
msgid "%s (C function)"
msgstr "%s (C fonksiyonu)"
-#: sphinx/domains/c.py:135
+#: sphinx/domains/c.py:143
#, python-format
msgid "%s (C member)"
msgstr "%s (C öğesi)"
-#: sphinx/domains/c.py:137
+#: sphinx/domains/c.py:145
#, python-format
msgid "%s (C macro)"
msgstr "%s (C makrosu)"
-#: sphinx/domains/c.py:139
+#: sphinx/domains/c.py:147
#, python-format
msgid "%s (C type)"
msgstr "%s (C tipi)"
-#: sphinx/domains/c.py:141
+#: sphinx/domains/c.py:149
#, python-format
msgid "%s (C variable)"
msgstr "%s (C değişkeni)"
-#: sphinx/domains/c.py:171
-#: sphinx/domains/cpp.py:1031
-#: sphinx/domains/javascript.py:166
-#: sphinx/domains/python.py:497
+#: sphinx/domains/c.py:204 sphinx/domains/cpp.py:1060
+#: sphinx/domains/javascript.py:162 sphinx/domains/python.py:559
msgid "function"
msgstr "fonksiyonu"
-#: sphinx/domains/c.py:172
-#: sphinx/domains/cpp.py:1032
+#: sphinx/domains/c.py:205 sphinx/domains/cpp.py:1061
msgid "member"
msgstr "öğesi"
-#: sphinx/domains/c.py:173
+#: sphinx/domains/c.py:206
msgid "macro"
msgstr "makrosu"
-#: sphinx/domains/c.py:174
-#: sphinx/domains/cpp.py:1033
+#: sphinx/domains/c.py:207 sphinx/domains/cpp.py:1062
msgid "type"
msgstr "tipi"
-#: sphinx/domains/c.py:175
+#: sphinx/domains/c.py:208
msgid "variable"
msgstr "değişkeni"
-#: sphinx/domains/cpp.py:876
+#: sphinx/domains/cpp.py:904
#, python-format
msgid "%s (C++ class)"
msgstr "%s (C++ sınıfı)"
-#: sphinx/domains/cpp.py:891
+#: sphinx/domains/cpp.py:919
#, python-format
msgid "%s (C++ type)"
msgstr "%s (C++ tipi)"
-#: sphinx/domains/cpp.py:910
+#: sphinx/domains/cpp.py:938
#, python-format
msgid "%s (C++ member)"
msgstr "%s (C++ öğesi)"
-#: sphinx/domains/cpp.py:962
+#: sphinx/domains/cpp.py:990
#, python-format
msgid "%s (C++ function)"
msgstr "%s (C++ fonksiyonu)"
-#: sphinx/domains/cpp.py:1030
-#: sphinx/domains/python.py:499
+#: sphinx/domains/cpp.py:1059 sphinx/domains/javascript.py:163
+#: sphinx/domains/python.py:561
msgid "class"
msgstr "sınıfı"
-#: sphinx/domains/javascript.py:117
-#: sphinx/domains/python.py:221
+#: sphinx/domains/javascript.py:106 sphinx/domains/python.py:254
#, python-format
msgid "%s() (built-in function)"
msgstr "%s() (gömülü fonksiyon)"
-#: sphinx/domains/javascript.py:118
-#: sphinx/domains/python.py:285
+#: sphinx/domains/javascript.py:107 sphinx/domains/python.py:318
#, python-format
msgid "%s() (%s method)"
msgstr "%s() (%s metodu)"
-#: sphinx/domains/javascript.py:120
+#: sphinx/domains/javascript.py:109
+#, python-format
+msgid "%s() (class)"
+msgstr "%s() (sınıfı)"
+
+#: sphinx/domains/javascript.py:111
#, python-format
msgid "%s (global variable or constant)"
msgstr "%s (global değişken veya sabit)"
-#: sphinx/domains/javascript.py:122
-#: sphinx/domains/python.py:323
+#: sphinx/domains/javascript.py:113 sphinx/domains/python.py:356
#, python-format
msgid "%s (%s attribute)"
msgstr "%s (%s niteliği)"
-#: sphinx/domains/javascript.py:131
+#: sphinx/domains/javascript.py:122
msgid "Arguments"
msgstr "Argümanlar"
-#: sphinx/domains/javascript.py:134
+#: sphinx/domains/javascript.py:125
msgid "Throws"
msgstr "Şunu verir: "
-#: sphinx/domains/javascript.py:167
-#: sphinx/domains/python.py:498
+#: sphinx/domains/javascript.py:164 sphinx/domains/python.py:560
msgid "data"
msgstr "verisi"
-#: sphinx/domains/javascript.py:168
-#: sphinx/domains/python.py:504
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:566
msgid "attribute"
msgstr "niteliği"
-#: sphinx/domains/python.py:53
+#: sphinx/domains/python.py:100
msgid "Variables"
msgstr "Değişkenler"
-#: sphinx/domains/python.py:56
+#: sphinx/domains/python.py:104
msgid "Raises"
msgstr "Şunu üretir:"
-#: sphinx/domains/python.py:222
-#: sphinx/domains/python.py:279
-#: sphinx/domains/python.py:291
-#: sphinx/domains/python.py:304
+#: sphinx/domains/python.py:255 sphinx/domains/python.py:312
+#: sphinx/domains/python.py:324 sphinx/domains/python.py:337
#, python-format
msgid "%s() (in module %s)"
msgstr "%s() (%s modülü içinde)"
-#: sphinx/domains/python.py:225
+#: sphinx/domains/python.py:258
#, python-format
msgid "%s (built-in variable)"
msgstr "%s (gömülü değişken)"
-#: sphinx/domains/python.py:226
-#: sphinx/domains/python.py:317
+#: sphinx/domains/python.py:259 sphinx/domains/python.py:350
#, python-format
msgid "%s (in module %s)"
msgstr "%s (%s modülü içinde)"
-#: sphinx/domains/python.py:242
+#: sphinx/domains/python.py:275
#, python-format
msgid "%s (built-in class)"
msgstr "%s (gömülü sınıf)"
-#: sphinx/domains/python.py:243
+#: sphinx/domains/python.py:276
#, python-format
msgid "%s (class in %s)"
msgstr "%s (%s içinde bir sınıf)"
-#: sphinx/domains/python.py:283
+#: sphinx/domains/python.py:316
#, python-format
msgid "%s() (%s.%s method)"
msgstr "%s() (%s.%s metodu)"
-#: sphinx/domains/python.py:295
+#: sphinx/domains/python.py:328
#, python-format
msgid "%s() (%s.%s static method)"
msgstr "%s() (%s.%s statik metodu)"
-#: sphinx/domains/python.py:298
+#: sphinx/domains/python.py:331
#, python-format
msgid "%s() (%s static method)"
msgstr "%s() (%s statik metodu)"
-#: sphinx/domains/python.py:308
+#: sphinx/domains/python.py:341
#, python-format
msgid "%s() (%s.%s class method)"
msgstr "%s() (%s.%s sınıf metodu)"
-#: sphinx/domains/python.py:311
+#: sphinx/domains/python.py:344
#, python-format
msgid "%s() (%s class method)"
msgstr "%s() (%s sınıf metodu)"
-#: sphinx/domains/python.py:321
+#: sphinx/domains/python.py:354
#, python-format
msgid "%s (%s.%s attribute)"
msgstr "%s (%s.%s niteliği)"
-#: sphinx/domains/python.py:366
-msgid "Platforms: "
-msgstr "Platformlar:"
-
-#: sphinx/domains/python.py:372
+#: sphinx/domains/python.py:434
#, python-format
msgid "%s (module)"
msgstr "%s (modül)"
-#: sphinx/domains/python.py:429
+#: sphinx/domains/python.py:491
msgid "Python Module Index"
msgstr "Python Modül Dizini"
-#: sphinx/domains/python.py:430
+#: sphinx/domains/python.py:492
msgid "modules"
msgstr "modüller"
-#: sphinx/domains/python.py:475
+#: sphinx/domains/python.py:537
msgid "Deprecated"
msgstr "Önerilmiyor"
-#: sphinx/domains/python.py:500
-#: sphinx/locale/__init__.py:162
+#: sphinx/domains/python.py:562 sphinx/locale/__init__.py:179
msgid "exception"
msgstr "istisnası"
-#: sphinx/domains/python.py:501
+#: sphinx/domains/python.py:563
msgid "method"
msgstr "metodu"
-#: sphinx/domains/python.py:502
-#, python-format
+#: sphinx/domains/python.py:564
msgid "class method"
msgstr "sınıf metodu"
-#: sphinx/domains/python.py:503
+#: sphinx/domains/python.py:565
msgid "static method"
msgstr "statik metodu"
-#: sphinx/domains/python.py:505
-#: sphinx/locale/__init__.py:158
+#: sphinx/domains/python.py:567 sphinx/locale/__init__.py:175
msgid "module"
msgstr "modülü"
-#: sphinx/domains/rst.py:53
+#: sphinx/domains/python.py:695
+msgid " (deprecated)"
+msgstr " (önerilmiyor)"
+
+#: sphinx/domains/rst.py:55
#, python-format
msgid "%s (directive)"
msgstr "%s (yönerge)"
-#: sphinx/domains/rst.py:55
+#: sphinx/domains/rst.py:57
#, python-format
msgid "%s (role)"
msgstr "%s (rol)"
-#: sphinx/domains/rst.py:103
+#: sphinx/domains/rst.py:106
msgid "directive"
msgstr "yönergesi"
-#: sphinx/domains/rst.py:104
+#: sphinx/domains/rst.py:107
msgid "role"
msgstr "rolü"
-#: sphinx/domains/std.py:68
-#: sphinx/domains/std.py:84
+#: sphinx/domains/std.py:70 sphinx/domains/std.py:86
#, python-format
msgid "environment variable; %s"
msgstr "çevre değişkeni; %s"
-#: sphinx/domains/std.py:160
+#: sphinx/domains/std.py:162
#, python-format
msgid "%scommand line option; %s"
msgstr "%skomut satırı seçeneği; %s"
-#: sphinx/domains/std.py:328
+#: sphinx/domains/std.py:393
msgid "glossary term"
msgstr "sözlük terimi"
-#: sphinx/domains/std.py:329
+#: sphinx/domains/std.py:394
msgid "grammar token"
msgstr "dilbilgisi girdisi"
-#: sphinx/domains/std.py:330
+#: sphinx/domains/std.py:395
msgid "reference label"
msgstr "referans etiketi"
-#: sphinx/domains/std.py:331
+#: sphinx/domains/std.py:396
msgid "environment variable"
msgstr "çevre değişkeni"
-#: sphinx/domains/std.py:332
+#: sphinx/domains/std.py:397
msgid "program option"
msgstr "program seçeneği"
-#: sphinx/domains/std.py:360
-#: sphinx/themes/basic/genindex-single.html:11
+#: sphinx/domains/std.py:427 sphinx/themes/basic/genindex-single.html:32
#: sphinx/themes/basic/genindex-split.html:11
#: sphinx/themes/basic/genindex-split.html:14
-#: sphinx/themes/basic/genindex.html:11
-#: sphinx/themes/basic/genindex.html:14
-#: sphinx/themes/basic/genindex.html:50
-#: sphinx/themes/basic/layout.html:125
-#: sphinx/writers/latex.py:173
+#: sphinx/themes/basic/genindex.html:32 sphinx/themes/basic/genindex.html:35
+#: sphinx/themes/basic/genindex.html:68 sphinx/themes/basic/layout.html:134
+#: sphinx/writers/latex.py:179 sphinx/writers/texinfo.py:456
msgid "Index"
msgstr "Dizin"
-#: sphinx/domains/std.py:361
+#: sphinx/domains/std.py:428
msgid "Module Index"
msgstr "Modül Dizini"
-#: sphinx/domains/std.py:362
-#: sphinx/themes/basic/defindex.html:25
+#: sphinx/domains/std.py:429 sphinx/themes/basic/defindex.html:25
msgid "Search Page"
msgstr "Arama Sayfası"
-#: sphinx/ext/autodoc.py:917
+#: sphinx/ext/autodoc.py:1002
#, python-format
msgid " Bases: %s"
msgstr " Taban: %s"
-#: sphinx/ext/autodoc.py:950
+#: sphinx/ext/autodoc.py:1038
#, python-format
msgid "alias of :class:`%s`"
msgstr "şunun takma adı: :class:`%s`"
@@ -424,131 +419,125 @@ msgstr "(<<özgün girdi>> %s içinde ve %d satırında bulunuyor.)"
msgid "original entry"
msgstr "özgün girdi"
-#: sphinx/ext/viewcode.py:66
+#: sphinx/ext/viewcode.py:70
msgid "[source]"
msgstr "[kaynak]"
-#: sphinx/ext/viewcode.py:109
+#: sphinx/ext/viewcode.py:117
msgid "[docs]"
msgstr "[belgeler]"
-#: sphinx/ext/viewcode.py:123
+#: sphinx/ext/viewcode.py:131
msgid "Module code"
msgstr "Modül kodu"
-#: sphinx/ext/viewcode.py:129
+#: sphinx/ext/viewcode.py:137
#, python-format
msgid "<h1>Source code for %s</h1>"
msgstr "<h1>%s öğesinin kaynak kodu</h1>"
-#: sphinx/ext/viewcode.py:156
+#: sphinx/ext/viewcode.py:164
msgid "Overview: module code"
msgstr "Genel bakış: modül kodu"
-#: sphinx/ext/viewcode.py:157
+#: sphinx/ext/viewcode.py:165
msgid "<h1>All modules for which code is available</h1>"
msgstr "<h1>Kodları mevcut bütün modüller</h1>"
-#: sphinx/locale/__init__.py:139
+#: sphinx/locale/__init__.py:155
msgid "Attention"
msgstr "Dikkat"
-#: sphinx/locale/__init__.py:140
+#: sphinx/locale/__init__.py:156
msgid "Caution"
msgstr "Uyarı"
-#: sphinx/locale/__init__.py:141
+#: sphinx/locale/__init__.py:157
msgid "Danger"
msgstr "Tehlike"
-#: sphinx/locale/__init__.py:142
+#: sphinx/locale/__init__.py:158
msgid "Error"
msgstr "Hata"
-#: sphinx/locale/__init__.py:143
+#: sphinx/locale/__init__.py:159
msgid "Hint"
msgstr "İpucu"
-#: sphinx/locale/__init__.py:144
+#: sphinx/locale/__init__.py:160
msgid "Important"
msgstr "Önemli"
-#: sphinx/locale/__init__.py:145
+#: sphinx/locale/__init__.py:161
msgid "Note"
msgstr "Not"
-#: sphinx/locale/__init__.py:146
+#: sphinx/locale/__init__.py:162
msgid "See Also"
msgstr "Ayrıca bkz."
-#: sphinx/locale/__init__.py:147
+#: sphinx/locale/__init__.py:163
msgid "Tip"
msgstr "Tüyo"
-#: sphinx/locale/__init__.py:148
+#: sphinx/locale/__init__.py:164
msgid "Warning"
msgstr "Uyarı"
-#: sphinx/locale/__init__.py:152
+#: sphinx/locale/__init__.py:168
#, python-format
msgid "New in version %s"
msgstr "%s sürümüyle geldi"
-#: sphinx/locale/__init__.py:153
+#: sphinx/locale/__init__.py:169
#, python-format
msgid "Changed in version %s"
msgstr "%s sürümünde değişti"
-#: sphinx/locale/__init__.py:154
+#: sphinx/locale/__init__.py:170
#, python-format
msgid "Deprecated since version %s"
msgstr "%s sürümünden beri önerilmiyor"
-#: sphinx/locale/__init__.py:159
+#: sphinx/locale/__init__.py:176
msgid "keyword"
-msgstr "anahtar kelime"
+msgstr "anahtar sözcük"
-#: sphinx/locale/__init__.py:160
+#: sphinx/locale/__init__.py:177
msgid "operator"
msgstr "işleç"
-#: sphinx/locale/__init__.py:161
+#: sphinx/locale/__init__.py:178
msgid "object"
msgstr "nesne"
-#: sphinx/locale/__init__.py:163
+#: sphinx/locale/__init__.py:180
msgid "statement"
msgstr "deyim"
-#: sphinx/locale/__init__.py:164
+#: sphinx/locale/__init__.py:181
msgid "built-in function"
msgstr "gömülü fonksiyon"
-#: sphinx/themes/agogo/layout.html:45
-#: sphinx/themes/basic/globaltoc.html:10
+#: sphinx/themes/agogo/layout.html:45 sphinx/themes/basic/globaltoc.html:10
#: sphinx/themes/basic/localtoc.html:11
msgid "Table Of Contents"
msgstr "İçindekiler Tablosu"
-#: sphinx/themes/agogo/layout.html:49
-#: sphinx/themes/basic/layout.html:128
-#: sphinx/themes/basic/search.html:11
-#: sphinx/themes/basic/search.html:14
+#: sphinx/themes/agogo/layout.html:49 sphinx/themes/basic/layout.html:137
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:20
msgid "Search"
msgstr "Ara"
-#: sphinx/themes/agogo/layout.html:52
-#: sphinx/themes/basic/searchbox.html:15
+#: sphinx/themes/agogo/layout.html:52 sphinx/themes/basic/searchbox.html:15
msgid "Go"
msgstr "Git"
-#: sphinx/themes/agogo/layout.html:57
-#: sphinx/themes/basic/searchbox.html:20
+#: sphinx/themes/agogo/layout.html:57 sphinx/themes/basic/searchbox.html:20
msgid "Enter search terms or a module, class or function name."
msgstr "Aranacak terimleri veya modül, sınıf ya da fonksiyon adını yazınız"
-#: sphinx/themes/agogo/layout.html:78
-#: sphinx/themes/basic/sourcelink.html:14
+#: sphinx/themes/agogo/layout.html:78 sphinx/themes/basic/sourcelink.html:14
msgid "Show Source"
msgstr "Kaynağı Göster"
@@ -584,15 +573,15 @@ msgstr "bütün modüllere hızlı erişim"
msgid "all functions, classes, terms"
msgstr "bütün fonksiyonlar, sınıflar, terimler"
-#: sphinx/themes/basic/genindex-single.html:14
+#: sphinx/themes/basic/genindex-single.html:35
#, python-format
msgid "Index &ndash; %(key)s"
msgstr "Dizin &ndash; %(key)s"
-#: sphinx/themes/basic/genindex-single.html:46
+#: sphinx/themes/basic/genindex-single.html:63
#: sphinx/themes/basic/genindex-split.html:24
#: sphinx/themes/basic/genindex-split.html:38
-#: sphinx/themes/basic/genindex.html:56
+#: sphinx/themes/basic/genindex.html:74
msgid "Full index on one page"
msgstr "Bütün dizin tek sayfada"
@@ -604,42 +593,46 @@ msgstr "Harfe göre dizin sayfaları"
msgid "can be huge"
msgstr "çok büyük olabilir"
-#: sphinx/themes/basic/layout.html:23
+#: sphinx/themes/basic/layout.html:29
msgid "Navigation"
msgstr "Gezinti"
-#: sphinx/themes/basic/layout.html:113
+#: sphinx/themes/basic/layout.html:122
#, python-format
msgid "Search within %(docstitle)s"
msgstr "%(docstitle)s içinde ara"
-#: sphinx/themes/basic/layout.html:122
+#: sphinx/themes/basic/layout.html:131
msgid "About these documents"
msgstr "Bu belgeler hakkında"
-#: sphinx/themes/basic/layout.html:131
+#: sphinx/themes/basic/layout.html:140
msgid "Copyright"
msgstr "Copyright"
-#: sphinx/themes/basic/layout.html:180
+#: sphinx/themes/basic/layout.html:189
#, python-format
msgid "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
msgstr "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
-#: sphinx/themes/basic/layout.html:182
+#: sphinx/themes/basic/layout.html:191
#, python-format
msgid "&copy; Copyright %(copyright)s."
msgstr "&copy; Copyright %(copyright)s."
-#: sphinx/themes/basic/layout.html:186
+#: sphinx/themes/basic/layout.html:195
#, python-format
msgid "Last updated on %(last_updated)s."
msgstr "Son güncelleme: %(last_updated)s."
-#: sphinx/themes/basic/layout.html:189
+#: sphinx/themes/basic/layout.html:198
#, python-format
-msgid "Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> %(sphinx_version)s."
-msgstr "<a href=\"http://sphinx.pocoo.org/\">Sphinx</a> %(sphinx_version)s ile oluşturulmuştur."
+msgid ""
+"Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+"<a href=\"http://sphinx.pocoo.org/\">Sphinx</a> %(sphinx_version)s ile "
+"oluşturulmuştur."
#: sphinx/themes/basic/opensearch.xml:4
#, python-format
@@ -662,7 +655,7 @@ msgstr "Sonraki konu"
msgid "next chapter"
msgstr "sonraki bölüm"
-#: sphinx/themes/basic/search.html:18
+#: sphinx/themes/basic/search.html:24
msgid ""
"Please activate JavaScript to enable the search\n"
" functionality."
@@ -670,7 +663,7 @@ msgstr ""
"Arama işlevini kullanabilmek için lütfen JavaScript'i\n"
" etkinleştirin."
-#: sphinx/themes/basic/search.html:23
+#: sphinx/themes/basic/search.html:29
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"
@@ -682,16 +675,15 @@ msgstr ""
"otomatik olarak bütün kelimeleri arayacaktır. Eksik kelime içeren \n"
"sayfalar sonuç listesinde görünmez."
-#: sphinx/themes/basic/search.html:30
+#: sphinx/themes/basic/search.html:36
msgid "search"
msgstr "ara"
-#: sphinx/themes/basic/search.html:34
-#: sphinx/themes/basic/static/searchtools.js:489
+#: sphinx/themes/basic/search.html:40
msgid "Search Results"
msgstr "Arama Sonuçları"
-#: sphinx/themes/basic/search.html:36
+#: sphinx/themes/basic/search.html:42
msgid "Your search did not match any results."
msgstr "Arama sonucunda herhangi bir belge bulunamadı."
@@ -731,14 +723,12 @@ msgstr "C API'sindeki değişiklikler"
msgid "Other changes"
msgstr "Diğer değişiklikler"
-#: sphinx/themes/basic/static/doctools.js:154
-#: sphinx/writers/html.py:482
-#: sphinx/writers/html.py:487
+#: sphinx/themes/basic/static/doctools.js:154 sphinx/writers/html.py:504
+#: sphinx/writers/html.py:510
msgid "Permalink to this headline"
msgstr "Bu başlığın kalıcı bağlantısı"
-#: sphinx/themes/basic/static/doctools.js:160
-#: sphinx/writers/html.py:87
+#: sphinx/themes/basic/static/doctools.js:160 sphinx/writers/html.py:92
msgid "Permalink to this definition"
msgstr "Bu tanımın kalıcı bağlantısı"
@@ -746,33 +736,12 @@ msgstr "Bu tanımın kalıcı bağlantısı"
msgid "Hide Search Matches"
msgstr "Arama Sonuçlarını Gizle"
-#: sphinx/themes/basic/static/searchtools.js:285
-msgid "Searching"
-msgstr "Arıyor"
-
-#: sphinx/themes/basic/static/searchtools.js:290
-msgid "Preparing search..."
-msgstr "Aramaya hazırlanıyor..."
-
-#: sphinx/themes/basic/static/searchtools.js:364
-msgid ", in "
-msgstr ", şunun içinde: "
-
-#: sphinx/themes/basic/static/searchtools.js:491
-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 "Arama sonucunda hiçbir belge bulunamadı. Bütün kelimeleri doğru yazdığınızdan ve gereken kategorileri seçtiğinizden emin olun."
-
-#: sphinx/themes/basic/static/searchtools.js:493
-#, python-format
-msgid "Search finished, found %s page(s) matching the search query."
-msgstr "Arama sonuçlandı, aramayla eşleşen %s sayfa bulundu."
-
-#: sphinx/themes/default/static/sidebar.js:66
+#: sphinx/themes/default/static/sidebar.js:69
msgid "Expand sidebar"
msgstr "Yan çubuğu genişlet"
-#: sphinx/themes/default/static/sidebar.js:79
-#: sphinx/themes/default/static/sidebar.js:106
+#: sphinx/themes/default/static/sidebar.js:82
+#: sphinx/themes/default/static/sidebar.js:110
msgid "Collapse sidebar"
msgstr "Yan çubuğu daralt"
@@ -780,24 +749,24 @@ msgstr "Yan çubuğu daralt"
msgid "Contents"
msgstr "İçindekiler"
-#: sphinx/writers/latex.py:171
+#: sphinx/writers/latex.py:177
msgid "Release"
msgstr "Sürüm"
-#: sphinx/writers/latex.py:572
-#: sphinx/writers/manpage.py:178
+#: sphinx/writers/latex.py:594 sphinx/writers/manpage.py:182
+#: sphinx/writers/texinfo.py:589
msgid "Footnotes"
msgstr "Dipnotları"
-#: sphinx/writers/latex.py:641
+#: sphinx/writers/latex.py:676
msgid "continued from previous page"
msgstr "önceki sayfadan devam"
-#: sphinx/writers/latex.py:646
+#: sphinx/writers/latex.py:681
msgid "Continued on next page"
msgstr "Devamı sonraki sayfada"
-#: sphinx/writers/text.py:422
+#: sphinx/writers/text.py:437
msgid "[image]"
msgstr "[resim]"
diff --git a/sphinx/locale/uk_UA/LC_MESSAGES/sphinx.js b/sphinx/locale/uk_UA/LC_MESSAGES/sphinx.js
index 7af42ca8..1c7babb7 100644
--- a/sphinx/locale/uk_UA/LC_MESSAGES/sphinx.js
+++ b/sphinx/locale/uk_UA/LC_MESSAGES/sphinx.js
@@ -1 +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": {"Search Results": "\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0438 \u043f\u043e\u0448\u0443\u043a\u0443", "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 ", "Expand sidebar": "", "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", "Collapse sidebar": "", "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"}}); \ No newline at end of file
+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": {"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", "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", "Expand sidebar": "", "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", "Collapse sidebar": ""}}); \ 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
index cfa0b8e0..4bc58ee1 100644
--- a/sphinx/locale/uk_UA/LC_MESSAGES/sphinx.mo
+++ b/sphinx/locale/uk_UA/LC_MESSAGES/sphinx.mo
Binary files differ
diff --git a/sphinx/locale/uk_UA/LC_MESSAGES/sphinx.po b/sphinx/locale/uk_UA/LC_MESSAGES/sphinx.po
index 6871e412..32ce1dc4 100644
--- a/sphinx/locale/uk_UA/LC_MESSAGES/sphinx.po
+++ b/sphinx/locale/uk_UA/LC_MESSAGES/sphinx.po
@@ -7,8 +7,8 @@ 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: 2010-05-24 23:54+0200\n"
+"POT-Creation-Date: 2011-09-21 10:06+0200\n"
+"PO-Revision-Date: 2011-09-21 10:15+0200\n"
"Last-Translator: Petro Sasnyk <petro@sasnyk.name>\n"
"Language-Team: uk_UA <LL@li.org>\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
@@ -16,380 +16,398 @@ msgstr ""
"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"
+"Generated-By: Babel 0.9.6\n"
-#: sphinx/environment.py:106 sphinx/writers/latex.py:184
-#: sphinx/writers/manpage.py:67
+#: sphinx/config.py:81
+#, python-format
+msgid "%s %s documentation"
+msgstr ""
+
+#: sphinx/environment.py:119 sphinx/writers/latex.py:190
+#: sphinx/writers/manpage.py:67 sphinx/writers/texinfo.py:203
#, python-format
msgid "%B %d, %Y"
msgstr ""
-#: sphinx/roles.py:174
+#: sphinx/environment.py:1625
+#, python-format
+msgid "see %s"
+msgstr ""
+
+#: sphinx/environment.py:1628
+#, fuzzy, python-format
+msgid "see also %s"
+msgstr "дивись також %s"
+
+#: sphinx/roles.py:175
#, python-format
-msgid "Python Enhancement Proposals!PEP %s"
-msgstr "Python Enhancement Proposals!PEP %s"
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr "Python Enhancement Proposals; PEP %s"
-#: sphinx/builders/changes.py:72
+#: sphinx/builders/changes.py:73
msgid "Builtins"
msgstr "Вбудовані елементи"
-#: sphinx/builders/changes.py:74
+#: sphinx/builders/changes.py:75
msgid "Module level"
msgstr "Рівень модуля"
-#: sphinx/builders/html.py:266
+#: sphinx/builders/html.py:274
#, python-format
msgid "%b %d, %Y"
msgstr "%b %d, %Y"
-#: sphinx/builders/html.py:285 sphinx/themes/basic/defindex.html:30
+#: sphinx/builders/html.py:293 sphinx/themes/basic/defindex.html:30
msgid "General Index"
msgstr "Загальний індекс"
-#: sphinx/builders/html.py:285
+#: sphinx/builders/html.py:293
msgid "index"
msgstr "індекс"
-#: sphinx/builders/html.py:345
+#: sphinx/builders/html.py:353
msgid "next"
msgstr "наступний"
-#: sphinx/builders/html.py:354
+#: sphinx/builders/html.py:362
msgid "previous"
msgstr "попередній"
-#: sphinx/builders/latex.py:151
+#: sphinx/builders/latex.py:141 sphinx/builders/texinfo.py:196
msgid " (in "
msgstr " (в "
-#: sphinx/directives/other.py:127
+#: sphinx/directives/other.py:136
msgid "Section author: "
msgstr "Автор секції: "
-#: sphinx/directives/other.py:129
+#: sphinx/directives/other.py:138
msgid "Module author: "
msgstr "Автор модуля: "
-#: sphinx/directives/other.py:131
+#: sphinx/directives/other.py:140
#, fuzzy
msgid "Code author: "
msgstr "Автор модуля: "
-#: sphinx/directives/other.py:133
+#: sphinx/directives/other.py:142
msgid "Author: "
msgstr "Автор: "
-#: sphinx/directives/other.py:238
+#: sphinx/directives/other.py:215
msgid "See also"
msgstr "Дивись також"
-#: sphinx/domains/__init__.py:253
+#: sphinx/domains/__init__.py:244
#, python-format
msgid "%s %s"
msgstr ""
-#: sphinx/domains/c.py:51 sphinx/domains/python.py:49
+#: sphinx/domains/c.py:51 sphinx/domains/python.py:95
msgid "Parameters"
msgstr "Параметри"
-#: sphinx/domains/c.py:54 sphinx/domains/javascript.py:137
-#: sphinx/domains/python.py:59
+#: sphinx/domains/c.py:54 sphinx/domains/javascript.py:128
+#: sphinx/domains/python.py:107
msgid "Returns"
msgstr "Повертає"
-#: sphinx/domains/c.py:56 sphinx/domains/python.py:61
+#: sphinx/domains/c.py:56 sphinx/domains/python.py:109
msgid "Return type"
msgstr "Тип повернення"
-#: sphinx/domains/c.py:133
+#: sphinx/domains/c.py:141
#, python-format
msgid "%s (C function)"
msgstr "%s (С функція)"
-#: sphinx/domains/c.py:135
+#: sphinx/domains/c.py:143
#, python-format
msgid "%s (C member)"
msgstr "%s (C член)"
-#: sphinx/domains/c.py:137
+#: sphinx/domains/c.py:145
#, python-format
msgid "%s (C macro)"
msgstr "%s (C макрос)"
-#: sphinx/domains/c.py:139
+#: sphinx/domains/c.py:147
#, python-format
msgid "%s (C type)"
msgstr "%s (C тип)"
-#: sphinx/domains/c.py:141
+#: sphinx/domains/c.py:149
#, python-format
msgid "%s (C variable)"
msgstr "%s (C змінна)"
-#: sphinx/domains/c.py:171 sphinx/domains/cpp.py:1031
-#: sphinx/domains/javascript.py:166 sphinx/domains/python.py:497
+#: sphinx/domains/c.py:204 sphinx/domains/cpp.py:1060
+#: sphinx/domains/javascript.py:162 sphinx/domains/python.py:559
msgid "function"
msgstr "функція"
-#: sphinx/domains/c.py:172 sphinx/domains/cpp.py:1032
+#: sphinx/domains/c.py:205 sphinx/domains/cpp.py:1061
msgid "member"
msgstr "член"
-#: sphinx/domains/c.py:173
+#: sphinx/domains/c.py:206
msgid "macro"
msgstr "макрос"
-#: sphinx/domains/c.py:174 sphinx/domains/cpp.py:1033
+#: sphinx/domains/c.py:207 sphinx/domains/cpp.py:1062
msgid "type"
msgstr "тип"
-#: sphinx/domains/c.py:175
+#: sphinx/domains/c.py:208
#, fuzzy
msgid "variable"
msgstr "Змінна"
-#: sphinx/domains/cpp.py:876
+#: sphinx/domains/cpp.py:904
#, python-format
msgid "%s (C++ class)"
msgstr "%s (C++ клас)"
-#: sphinx/domains/cpp.py:891
+#: sphinx/domains/cpp.py:919
#, python-format
msgid "%s (C++ type)"
msgstr "%s (C++ тип)"
-#: sphinx/domains/cpp.py:910
+#: sphinx/domains/cpp.py:938
#, python-format
msgid "%s (C++ member)"
msgstr "%s (C++ член)"
-#: sphinx/domains/cpp.py:962
+#: sphinx/domains/cpp.py:990
#, python-format
msgid "%s (C++ function)"
msgstr "%s (C++ функція)"
-#: sphinx/domains/cpp.py:1030 sphinx/domains/python.py:499
+#: sphinx/domains/cpp.py:1059 sphinx/domains/javascript.py:163
+#: sphinx/domains/python.py:561
msgid "class"
msgstr "клас"
-#: sphinx/domains/javascript.py:117 sphinx/domains/python.py:221
+#: sphinx/domains/javascript.py:106 sphinx/domains/python.py:254
#, python-format
msgid "%s() (built-in function)"
msgstr "%s() (вбудована функція)"
-#: sphinx/domains/javascript.py:118 sphinx/domains/python.py:285
+#: sphinx/domains/javascript.py:107 sphinx/domains/python.py:318
#, python-format
msgid "%s() (%s method)"
msgstr "%s() (%s метод)"
-#: sphinx/domains/javascript.py:120
+#: sphinx/domains/javascript.py:109
+#, python-format
+msgid "%s() (class)"
+msgstr "%s() (клас)"
+
+#: sphinx/domains/javascript.py:111
#, python-format
msgid "%s (global variable or constant)"
msgstr ""
-#: sphinx/domains/javascript.py:122 sphinx/domains/python.py:323
+#: sphinx/domains/javascript.py:113 sphinx/domains/python.py:356
#, python-format
msgid "%s (%s attribute)"
msgstr "%s (%s атрибут)"
-#: sphinx/domains/javascript.py:131
+#: sphinx/domains/javascript.py:122
#, fuzzy
msgid "Arguments"
msgstr "Параметри"
-#: sphinx/domains/javascript.py:134
+#: sphinx/domains/javascript.py:125
msgid "Throws"
msgstr ""
-#: sphinx/domains/javascript.py:167 sphinx/domains/python.py:498
+#: sphinx/domains/javascript.py:164 sphinx/domains/python.py:560
msgid "data"
msgstr ""
-#: sphinx/domains/javascript.py:168 sphinx/domains/python.py:504
-#, python-format
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:566
msgid "attribute"
msgstr "атрибут"
-#: sphinx/domains/python.py:53
+#: sphinx/domains/python.py:100
#, fuzzy
msgid "Variables"
msgstr "Змінна"
-#: sphinx/domains/python.py:56
+#: sphinx/domains/python.py:104
msgid "Raises"
msgstr "Викликає"
-#: sphinx/domains/python.py:222 sphinx/domains/python.py:279
-#: sphinx/domains/python.py:291 sphinx/domains/python.py:304
+#: sphinx/domains/python.py:255 sphinx/domains/python.py:312
+#: sphinx/domains/python.py:324 sphinx/domains/python.py:337
#, python-format
msgid "%s() (in module %s)"
msgstr "%s() (в модулі %s)"
-#: sphinx/domains/python.py:225
+#: sphinx/domains/python.py:258
#, python-format
msgid "%s (built-in variable)"
msgstr "%s (вбудована змінна)"
-#: sphinx/domains/python.py:226 sphinx/domains/python.py:317
+#: sphinx/domains/python.py:259 sphinx/domains/python.py:350
#, python-format
msgid "%s (in module %s)"
msgstr "%s (в модулі %s)"
-#: sphinx/domains/python.py:242
+#: sphinx/domains/python.py:275
#, python-format
msgid "%s (built-in class)"
msgstr "%s (вбудований клас)"
-#: sphinx/domains/python.py:243
+#: sphinx/domains/python.py:276
#, python-format
msgid "%s (class in %s)"
msgstr "%s (клас в %s)"
-#: sphinx/domains/python.py:283
+#: sphinx/domains/python.py:316
#, python-format
msgid "%s() (%s.%s method)"
msgstr "%s() (%s.%s метод)"
-#: sphinx/domains/python.py:295
+#: sphinx/domains/python.py:328
#, python-format
msgid "%s() (%s.%s static method)"
msgstr "%s() (%s.%s статичний метод)"
-#: sphinx/domains/python.py:298
+#: sphinx/domains/python.py:331
#, python-format
msgid "%s() (%s static method)"
msgstr "%s() (%s статичний метод)"
-#: sphinx/domains/python.py:308
+#: sphinx/domains/python.py:341
#, fuzzy, python-format
msgid "%s() (%s.%s class method)"
msgstr "%s() (%s.%s метод)"
-#: sphinx/domains/python.py:311
+#: sphinx/domains/python.py:344
#, fuzzy, python-format
msgid "%s() (%s class method)"
msgstr "%s() (%s метод)"
-#: sphinx/domains/python.py:321
+#: sphinx/domains/python.py:354
#, python-format
msgid "%s (%s.%s attribute)"
msgstr "%s (%s.%s атрибут)"
-#: sphinx/domains/python.py:366
-msgid "Platforms: "
-msgstr "Платформи: "
-
-#: sphinx/domains/python.py:372
+#: sphinx/domains/python.py:434
#, python-format
msgid "%s (module)"
msgstr "%s (модуль)"
-#: sphinx/domains/python.py:429
+#: sphinx/domains/python.py:491
#, fuzzy
msgid "Python Module Index"
msgstr "Індекс модулів"
-#: sphinx/domains/python.py:430
+#: sphinx/domains/python.py:492
msgid "modules"
msgstr "модулі"
-#: sphinx/domains/python.py:475
+#: sphinx/domains/python.py:537
msgid "Deprecated"
msgstr "Застарілий"
-#: sphinx/domains/python.py:500 sphinx/locale/__init__.py:162
+#: sphinx/domains/python.py:562 sphinx/locale/__init__.py:179
msgid "exception"
msgstr "виняткова ситуація"
-#: sphinx/domains/python.py:501
+#: sphinx/domains/python.py:563
msgid "method"
msgstr ""
-#: sphinx/domains/python.py:502
-#, fuzzy, python-format
+#: sphinx/domains/python.py:564
msgid "class method"
-msgstr "%s() (%s метод)"
+msgstr ""
-#: sphinx/domains/python.py:503
+#: sphinx/domains/python.py:565
msgid "static method"
msgstr "статичний метод"
-#: sphinx/domains/python.py:505 sphinx/locale/__init__.py:158
+#: sphinx/domains/python.py:567 sphinx/locale/__init__.py:175
msgid "module"
msgstr "модуль"
-#: sphinx/domains/rst.py:53
+#: sphinx/domains/python.py:695
+msgid " (deprecated)"
+msgstr " (застарілий)"
+
+#: sphinx/domains/rst.py:55
#, python-format
msgid "%s (directive)"
msgstr ""
-#: sphinx/domains/rst.py:55
-#, fuzzy, python-format
+#: sphinx/domains/rst.py:57
+#, python-format
msgid "%s (role)"
-msgstr "%s (модуль)"
+msgstr ""
-#: sphinx/domains/rst.py:103
+#: sphinx/domains/rst.py:106
msgid "directive"
msgstr ""
-#: sphinx/domains/rst.py:104
-#, fuzzy
+#: sphinx/domains/rst.py:107
msgid "role"
-msgstr "модуль"
+msgstr ""
-#: sphinx/domains/std.py:68 sphinx/domains/std.py:84
+#: sphinx/domains/std.py:70 sphinx/domains/std.py:86
#, python-format
msgid "environment variable; %s"
msgstr "змінна оточення; %s"
-#: sphinx/domains/std.py:160
+#: sphinx/domains/std.py:162
#, python-format
msgid "%scommand line option; %s"
msgstr "%sопція командного рядка; %s"
-#: sphinx/domains/std.py:328
+#: sphinx/domains/std.py:393
msgid "glossary term"
msgstr ""
-#: sphinx/domains/std.py:329
+#: sphinx/domains/std.py:394
msgid "grammar token"
msgstr ""
-#: sphinx/domains/std.py:330
+#: sphinx/domains/std.py:395
msgid "reference label"
msgstr ""
-#: sphinx/domains/std.py:331
+#: sphinx/domains/std.py:396
msgid "environment variable"
msgstr "змінна оточення"
-#: sphinx/domains/std.py:332
+#: sphinx/domains/std.py:397
msgid "program option"
msgstr ""
-#: sphinx/domains/std.py:360 sphinx/themes/basic/genindex-single.html:11
+#: sphinx/domains/std.py:427 sphinx/themes/basic/genindex-single.html:32
#: sphinx/themes/basic/genindex-split.html:11
#: sphinx/themes/basic/genindex-split.html:14
-#: sphinx/themes/basic/genindex.html:11 sphinx/themes/basic/genindex.html:14
-#: sphinx/themes/basic/genindex.html:50 sphinx/themes/basic/layout.html:125
-#: sphinx/writers/latex.py:173
+#: sphinx/themes/basic/genindex.html:32 sphinx/themes/basic/genindex.html:35
+#: sphinx/themes/basic/genindex.html:68 sphinx/themes/basic/layout.html:134
+#: sphinx/writers/latex.py:179 sphinx/writers/texinfo.py:456
msgid "Index"
msgstr "Індекс"
-#: sphinx/domains/std.py:361
+#: sphinx/domains/std.py:428
msgid "Module Index"
msgstr "Індекс модулів"
-#: sphinx/domains/std.py:362 sphinx/themes/basic/defindex.html:25
+#: sphinx/domains/std.py:429 sphinx/themes/basic/defindex.html:25
msgid "Search Page"
msgstr "Сторінка пошуку"
-#: sphinx/ext/autodoc.py:917
+#: sphinx/ext/autodoc.py:1002
#, python-format
msgid " Bases: %s"
msgstr " Базовий: %s"
-#: sphinx/ext/autodoc.py:950
+#: sphinx/ext/autodoc.py:1038
#, python-format
msgid "alias of :class:`%s`"
msgstr "синонім :class:`%s`"
@@ -401,110 +419,110 @@ msgstr "Доробити"
#: sphinx/ext/todo.py:109
#, fuzzy, python-format
msgid "(The <<original entry>> is located in %s, line %d.)"
-msgstr "(Початкове входження знаходиться в %s, рядок %d і може бути знайдений "
+msgstr "(Початкове входження знаходиться в %s, рядок %d.)"
#: sphinx/ext/todo.py:117
msgid "original entry"
msgstr ""
-#: sphinx/ext/viewcode.py:66
+#: sphinx/ext/viewcode.py:70
msgid "[source]"
msgstr ""
-#: sphinx/ext/viewcode.py:109
+#: sphinx/ext/viewcode.py:117
msgid "[docs]"
msgstr ""
-#: sphinx/ext/viewcode.py:123
+#: sphinx/ext/viewcode.py:131
#, fuzzy
msgid "Module code"
msgstr "модуль"
-#: sphinx/ext/viewcode.py:129
+#: sphinx/ext/viewcode.py:137
#, python-format
msgid "<h1>Source code for %s</h1>"
msgstr ""
-#: sphinx/ext/viewcode.py:156
+#: sphinx/ext/viewcode.py:164
msgid "Overview: module code"
msgstr ""
-#: sphinx/ext/viewcode.py:157
+#: sphinx/ext/viewcode.py:165
msgid "<h1>All modules for which code is available</h1>"
msgstr ""
-#: sphinx/locale/__init__.py:139
+#: sphinx/locale/__init__.py:155
msgid "Attention"
msgstr "Увага"
-#: sphinx/locale/__init__.py:140
+#: sphinx/locale/__init__.py:156
msgid "Caution"
msgstr "Застереження"
-#: sphinx/locale/__init__.py:141
+#: sphinx/locale/__init__.py:157
msgid "Danger"
msgstr "Небезпека"
-#: sphinx/locale/__init__.py:142
+#: sphinx/locale/__init__.py:158
msgid "Error"
msgstr "Помилка"
-#: sphinx/locale/__init__.py:143
+#: sphinx/locale/__init__.py:159
msgid "Hint"
msgstr "Підказка"
-#: sphinx/locale/__init__.py:144
+#: sphinx/locale/__init__.py:160
msgid "Important"
msgstr "Важливо"
-#: sphinx/locale/__init__.py:145
+#: sphinx/locale/__init__.py:161
msgid "Note"
msgstr "Примітка"
-#: sphinx/locale/__init__.py:146
+#: sphinx/locale/__init__.py:162
msgid "See Also"
msgstr "Дивись також"
-#: sphinx/locale/__init__.py:147
+#: sphinx/locale/__init__.py:163
msgid "Tip"
msgstr "Порада"
-#: sphinx/locale/__init__.py:148
+#: sphinx/locale/__init__.py:164
msgid "Warning"
msgstr "Попередження"
-#: sphinx/locale/__init__.py:152
+#: sphinx/locale/__init__.py:168
#, python-format
msgid "New in version %s"
msgstr "Нове в версії %s"
-#: sphinx/locale/__init__.py:153
+#: sphinx/locale/__init__.py:169
#, python-format
msgid "Changed in version %s"
msgstr "Змінено в версії %s"
-#: sphinx/locale/__init__.py:154
+#: sphinx/locale/__init__.py:170
#, python-format
msgid "Deprecated since version %s"
msgstr "Застаріло починаючи з версії %s"
-#: sphinx/locale/__init__.py:159
+#: sphinx/locale/__init__.py:176
msgid "keyword"
msgstr "ключове слово"
-#: sphinx/locale/__init__.py:160
+#: sphinx/locale/__init__.py:177
msgid "operator"
msgstr "оператор"
-#: sphinx/locale/__init__.py:161
+#: sphinx/locale/__init__.py:178
msgid "object"
msgstr "об'єкт"
-#: sphinx/locale/__init__.py:163
+#: sphinx/locale/__init__.py:180
msgid "statement"
msgstr "вираз"
-#: sphinx/locale/__init__.py:164
+#: sphinx/locale/__init__.py:181
msgid "built-in function"
msgstr "вбудована функція"
@@ -513,8 +531,8 @@ msgstr "вбудована функція"
msgid "Table Of Contents"
msgstr "Зміст"
-#: sphinx/themes/agogo/layout.html:49 sphinx/themes/basic/layout.html:128
-#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:14
+#: sphinx/themes/agogo/layout.html:49 sphinx/themes/basic/layout.html:137
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:20
msgid "Search"
msgstr "Пошук"
@@ -562,15 +580,15 @@ msgstr "швидкий доступ до всіх модулів"
msgid "all functions, classes, terms"
msgstr "всі функції, класи, терміни"
-#: sphinx/themes/basic/genindex-single.html:14
+#: sphinx/themes/basic/genindex-single.html:35
#, python-format
msgid "Index &ndash; %(key)s"
msgstr "Індекс &ndash; %(key)s"
-#: sphinx/themes/basic/genindex-single.html:46
+#: sphinx/themes/basic/genindex-single.html:63
#: sphinx/themes/basic/genindex-split.html:24
#: sphinx/themes/basic/genindex-split.html:38
-#: sphinx/themes/basic/genindex.html:56
+#: sphinx/themes/basic/genindex.html:74
msgid "Full index on one page"
msgstr "Повний індекс на одній сторінці"
@@ -582,39 +600,39 @@ msgstr "Індексні сторінки по символам"
msgid "can be huge"
msgstr "може бути величезним"
-#: sphinx/themes/basic/layout.html:23
+#: sphinx/themes/basic/layout.html:29
msgid "Navigation"
msgstr "Навігація"
-#: sphinx/themes/basic/layout.html:113
+#: sphinx/themes/basic/layout.html:122
#, python-format
msgid "Search within %(docstitle)s"
msgstr "Шукати в %(docstitle)s"
-#: sphinx/themes/basic/layout.html:122
+#: sphinx/themes/basic/layout.html:131
msgid "About these documents"
msgstr "Про ці документи"
-#: sphinx/themes/basic/layout.html:131
+#: sphinx/themes/basic/layout.html:140
msgid "Copyright"
msgstr "Авторські права"
-#: sphinx/themes/basic/layout.html:180
+#: sphinx/themes/basic/layout.html:189
#, python-format
msgid "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
msgstr "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
-#: sphinx/themes/basic/layout.html:182
+#: sphinx/themes/basic/layout.html:191
#, python-format
msgid "&copy; Copyright %(copyright)s."
msgstr "&copy; Copyright %(copyright)s."
-#: sphinx/themes/basic/layout.html:186
+#: sphinx/themes/basic/layout.html:195
#, python-format
msgid "Last updated on %(last_updated)s."
msgstr "Востаннє оновлено %(last_updated)s."
-#: sphinx/themes/basic/layout.html:189
+#: sphinx/themes/basic/layout.html:198
#, python-format
msgid ""
"Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
@@ -644,7 +662,7 @@ msgstr "Наступна тема"
msgid "next chapter"
msgstr "наступний розділ"
-#: sphinx/themes/basic/search.html:18
+#: sphinx/themes/basic/search.html:24
msgid ""
"Please activate JavaScript to enable the search\n"
" functionality."
@@ -653,7 +671,7 @@ msgstr ""
"\"\n"
"\" пошук."
-#: sphinx/themes/basic/search.html:23
+#: sphinx/themes/basic/search.html:29
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"
@@ -665,16 +683,15 @@ msgstr ""
" пошуку автоматично шукатиме за всіма словами. Сторінки\n"
" що містять менше слів не з'являться в результуючому списку."
-#: sphinx/themes/basic/search.html:30
+#: sphinx/themes/basic/search.html:36
msgid "search"
msgstr "пошук"
-#: sphinx/themes/basic/search.html:34
-#: sphinx/themes/basic/static/searchtools.js:489
+#: sphinx/themes/basic/search.html:40
msgid "Search Results"
msgstr "Результати пошуку"
-#: sphinx/themes/basic/search.html:36
+#: sphinx/themes/basic/search.html:42
msgid "Your search did not match any results."
msgstr "Ваш пошук не виявив жодних співпадінь."
@@ -714,12 +731,12 @@ msgstr "зміни C API"
msgid "Other changes"
msgstr "Інші зміни"
-#: sphinx/themes/basic/static/doctools.js:154 sphinx/writers/html.py:482
-#: sphinx/writers/html.py:487
+#: sphinx/themes/basic/static/doctools.js:154 sphinx/writers/html.py:504
+#: sphinx/writers/html.py:510
msgid "Permalink to this headline"
msgstr "Постійне посилання на цей заголовок"
-#: sphinx/themes/basic/static/doctools.js:160 sphinx/writers/html.py:87
+#: sphinx/themes/basic/static/doctools.js:160 sphinx/writers/html.py:92
msgid "Permalink to this definition"
msgstr "Постійне посилання на це визначення"
@@ -727,37 +744,12 @@ msgstr "Постійне посилання на це визначення"
msgid "Hide Search Matches"
msgstr "Приховати співпадіння пошуку"
-#: sphinx/themes/basic/static/searchtools.js:285
-msgid "Searching"
-msgstr "Шукаю"
-
-#: sphinx/themes/basic/static/searchtools.js:290
-msgid "Preparing search..."
-msgstr "Підготовка до пошуку..."
-
-#: sphinx/themes/basic/static/searchtools.js:364
-msgid ", in "
-msgstr ", в "
-
-#: sphinx/themes/basic/static/searchtools.js:491
-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/themes/basic/static/searchtools.js:493
-#, python-format
-msgid "Search finished, found %s page(s) matching the search query."
-msgstr "Пошук закінчено, знайдено %s сторінок які співпали з пошуковим запитом."
-
-#: sphinx/themes/default/static/sidebar.js:66
+#: sphinx/themes/default/static/sidebar.js:69
msgid "Expand sidebar"
msgstr ""
-#: sphinx/themes/default/static/sidebar.js:79
-#: sphinx/themes/default/static/sidebar.js:106
+#: sphinx/themes/default/static/sidebar.js:82
+#: sphinx/themes/default/static/sidebar.js:110
msgid "Collapse sidebar"
msgstr ""
@@ -765,23 +757,25 @@ msgstr ""
msgid "Contents"
msgstr ""
-#: sphinx/writers/latex.py:171
+#: sphinx/writers/latex.py:177
msgid "Release"
msgstr "Реліз"
-#: sphinx/writers/latex.py:572 sphinx/writers/manpage.py:178
+#: sphinx/writers/latex.py:594 sphinx/writers/manpage.py:182
+#: sphinx/writers/texinfo.py:589
msgid "Footnotes"
msgstr ""
-#: sphinx/writers/latex.py:641
+#: sphinx/writers/latex.py:676
msgid "continued from previous page"
msgstr ""
-#: sphinx/writers/latex.py:646
+#: sphinx/writers/latex.py:681
#, fuzzy
msgid "Continued on next page"
msgstr "Повний індекс на одній сторінці"
-#: sphinx/writers/text.py:422
+#: sphinx/writers/text.py:437
msgid "[image]"
msgstr ""
+
diff --git a/sphinx/locale/zh_CN/LC_MESSAGES/sphinx.js b/sphinx/locale/zh_CN/LC_MESSAGES/sphinx.js
index bf0de29d..a59a8b24 100644
--- a/sphinx/locale/zh_CN/LC_MESSAGES/sphinx.js
+++ b/sphinx/locale/zh_CN/LC_MESSAGES/sphinx.js
@@ -1 +1 @@
-Documentation.addTranslations({"locale": "zh_CN", "plural_expr": "0", "messages": {"Search Results": "\u641c\u7d22\u7ed3\u679c", "Preparing search...": "\u51c6\u5907\u641c\u7d22...", "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "\u4f60\u7684\u641c\u7d22\u6ca1\u6709\u5339\u914d\u5230\u4efb\u4f55\u6587\u6863\u3002\u8bf7\u786e\u8ba4\u4f60\u6240\u641c\u7d22\u7684\u5173\u952e\u5b57.", "Search finished, found %s page(s) matching the search query.": "\u641c\u7d22\u5b8c\u6210\uff0c \u627e\u5230\u4e86 %s \u9875\u5339\u914d\u6240\u641c\u7d22\u7684\u5173\u952e\u5b57", ", in ": ", \u4f4d\u4e8e", "Expand sidebar": "", "Permalink to this headline": "\u6c38\u4e45\u94fe\u63a5\u81f3\u6807\u9898", "Searching": "\u641c\u7d22\u4e2d", "Collapse sidebar": "", "Permalink to this definition": "\u6c38\u4e45\u94fe\u63a5\u81f3\u76ee\u6807", "Hide Search Matches": "\u9690\u85cf\u641c\u7d22\u7ed3\u679c"}}); \ No newline at end of file
+Documentation.addTranslations({"locale": "zh_CN", "plural_expr": "0", "messages": {"Hide Search Matches": "\u9690\u85cf\u641c\u7d22\u7ed3\u679c", "Permalink to this definition": "\u6c38\u4e45\u94fe\u63a5\u81f3\u76ee\u6807", "Expand sidebar": "", "Permalink to this headline": "\u6c38\u4e45\u94fe\u63a5\u81f3\u6807\u9898", "Collapse sidebar": ""}}); \ No newline at end of file
diff --git a/sphinx/locale/zh_CN/LC_MESSAGES/sphinx.mo b/sphinx/locale/zh_CN/LC_MESSAGES/sphinx.mo
index b62c4c5b..3d9dac2b 100644
--- a/sphinx/locale/zh_CN/LC_MESSAGES/sphinx.mo
+++ b/sphinx/locale/zh_CN/LC_MESSAGES/sphinx.mo
Binary files differ
diff --git a/sphinx/locale/zh_CN/LC_MESSAGES/sphinx.po b/sphinx/locale/zh_CN/LC_MESSAGES/sphinx.po
index 7afde026..cb7b3e6f 100644
--- a/sphinx/locale/zh_CN/LC_MESSAGES/sphinx.po
+++ b/sphinx/locale/zh_CN/LC_MESSAGES/sphinx.po
@@ -8,387 +8,407 @@ msgid ""
msgstr ""
"Project-Id-Version: Sphinx 0.6\n"
"Report-Msgid-Bugs-To: zhutao.iscas@gmail.com\n"
-"POT-Creation-Date: 2009-03-09 19:46+0120\n"
-"PO-Revision-Date: 2010-05-24 23:54+0200\n"
+"POT-Creation-Date: 2011-09-21 10:06+0200\n"
+"PO-Revision-Date: 2011-09-21 10:15+0200\n"
"Last-Translator: Tower Joo<zhutao.iscas@gmail.com>\n"
"Language-Team: cn <LL@li.org>\n"
"Plural-Forms: nplurals=1; plural=0\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"
+"Generated-By: Babel 0.9.6\n"
-#: sphinx/environment.py:106 sphinx/writers/latex.py:184
-#: sphinx/writers/manpage.py:67
+#: sphinx/config.py:81
+#, python-format
+msgid "%s %s documentation"
+msgstr ""
+
+#: sphinx/environment.py:119 sphinx/writers/latex.py:190
+#: sphinx/writers/manpage.py:67 sphinx/writers/texinfo.py:203
#, python-format
msgid "%B %d, %Y"
msgstr "%Y 年 %m 月 %d 日"
-#: sphinx/roles.py:174
+#: sphinx/environment.py:1625
+#, python-format
+msgid "see %s"
+msgstr ""
+
+#: sphinx/environment.py:1628
+#, python-format
+msgid "see also %s"
+msgstr "也可以参考 %s"
+
+#: sphinx/roles.py:175
#, python-format
-msgid "Python Enhancement Proposals!PEP %s"
-msgstr "Python 建议文件!PEP %s"
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr "Python 建议文件; PEP %s"
-#: sphinx/builders/changes.py:72
+#: sphinx/builders/changes.py:73
msgid "Builtins"
msgstr "内置"
-#: sphinx/builders/changes.py:74
+#: sphinx/builders/changes.py:75
msgid "Module level"
msgstr "模块级别"
-#: sphinx/builders/html.py:266
+#: sphinx/builders/html.py:274
#, python-format
msgid "%b %d, %Y"
msgstr "%Y 年 %m 月 %d 日"
-#: sphinx/builders/html.py:285 sphinx/themes/basic/defindex.html:30
+#: sphinx/builders/html.py:293 sphinx/themes/basic/defindex.html:30
msgid "General Index"
msgstr "总目录"
-#: sphinx/builders/html.py:285
+#: sphinx/builders/html.py:293
msgid "index"
msgstr "索引"
-#: sphinx/builders/html.py:345
+#: sphinx/builders/html.py:353
msgid "next"
msgstr "下一页"
-#: sphinx/builders/html.py:354
+#: sphinx/builders/html.py:362
msgid "previous"
msgstr "上一页"
-#: sphinx/builders/latex.py:151
+#: sphinx/builders/latex.py:141 sphinx/builders/texinfo.py:196
msgid " (in "
msgstr ""
-#: sphinx/directives/other.py:127
+#: sphinx/directives/other.py:136
msgid "Section author: "
msgstr "Section 作者:"
-#: sphinx/directives/other.py:129
+#: sphinx/directives/other.py:138
msgid "Module author: "
msgstr "模块作者:"
-#: sphinx/directives/other.py:131
+#: sphinx/directives/other.py:140
#, fuzzy
msgid "Code author: "
msgstr "模块作者:"
-#: sphinx/directives/other.py:133
+#: sphinx/directives/other.py:142
msgid "Author: "
msgstr "作者:"
-#: sphinx/directives/other.py:238
+#: sphinx/directives/other.py:215
msgid "See also"
msgstr "也可以参考"
-#: sphinx/domains/__init__.py:253
+#: sphinx/domains/__init__.py:244
#, python-format
msgid "%s %s"
msgstr ""
-#: sphinx/domains/c.py:51 sphinx/domains/python.py:49
+#: sphinx/domains/c.py:51 sphinx/domains/python.py:95
msgid "Parameters"
msgstr "参数"
-#: sphinx/domains/c.py:54 sphinx/domains/javascript.py:137
-#: sphinx/domains/python.py:59
+#: sphinx/domains/c.py:54 sphinx/domains/javascript.py:128
+#: sphinx/domains/python.py:107
msgid "Returns"
msgstr "返回"
-#: sphinx/domains/c.py:56 sphinx/domains/python.py:61
+#: sphinx/domains/c.py:56 sphinx/domains/python.py:109
msgid "Return type"
msgstr "返回类型"
-#: sphinx/domains/c.py:133
+#: sphinx/domains/c.py:141
#, python-format
msgid "%s (C function)"
msgstr "%s (C 函数)"
-#: sphinx/domains/c.py:135
+#: sphinx/domains/c.py:143
#, python-format
msgid "%s (C member)"
msgstr "%s (C 成员)"
-#: sphinx/domains/c.py:137
+#: sphinx/domains/c.py:145
#, python-format
msgid "%s (C macro)"
msgstr "%s (C 宏)"
-#: sphinx/domains/c.py:139
+#: sphinx/domains/c.py:147
#, python-format
msgid "%s (C type)"
msgstr "%s (C 类型)"
-#: sphinx/domains/c.py:141
+#: sphinx/domains/c.py:149
#, python-format
msgid "%s (C variable)"
msgstr "%s (C 变量)"
-#: sphinx/domains/c.py:171 sphinx/domains/cpp.py:1031
-#: sphinx/domains/javascript.py:166 sphinx/domains/python.py:497
+#: sphinx/domains/c.py:204 sphinx/domains/cpp.py:1060
+#: sphinx/domains/javascript.py:162 sphinx/domains/python.py:559
msgid "function"
msgstr "函数"
-#: sphinx/domains/c.py:172 sphinx/domains/cpp.py:1032
+#: sphinx/domains/c.py:205 sphinx/domains/cpp.py:1061
msgid "member"
msgstr "成员"
-#: sphinx/domains/c.py:173
+#: sphinx/domains/c.py:206
msgid "macro"
msgstr ""
-#: sphinx/domains/c.py:174 sphinx/domains/cpp.py:1033
+#: sphinx/domains/c.py:207 sphinx/domains/cpp.py:1062
msgid "type"
msgstr ""
-#: sphinx/domains/c.py:175
+#: sphinx/domains/c.py:208
#, fuzzy
msgid "variable"
msgstr "变量"
-#: sphinx/domains/cpp.py:876
+#: sphinx/domains/cpp.py:904
#, fuzzy, python-format
msgid "%s (C++ class)"
-msgstr "%s (內置类)"
+msgstr "%s (C++ 內置类)"
-#: sphinx/domains/cpp.py:891
+#: sphinx/domains/cpp.py:919
#, python-format
msgid "%s (C++ type)"
msgstr "%s (C++ 类型)"
-#: sphinx/domains/cpp.py:910
+#: sphinx/domains/cpp.py:938
#, python-format
msgid "%s (C++ member)"
msgstr "%s (C++ 成员)"
-#: sphinx/domains/cpp.py:962
+#: sphinx/domains/cpp.py:990
#, python-format
msgid "%s (C++ function)"
msgstr "%s (C++ 函数)"
-#: sphinx/domains/cpp.py:1030 sphinx/domains/python.py:499
+#: sphinx/domains/cpp.py:1059 sphinx/domains/javascript.py:163
+#: sphinx/domains/python.py:561
msgid "class"
msgstr ""
-#: sphinx/domains/javascript.py:117 sphinx/domains/python.py:221
+#: sphinx/domains/javascript.py:106 sphinx/domains/python.py:254
#, python-format
msgid "%s() (built-in function)"
msgstr "%s() (內置函数)"
-#: sphinx/domains/javascript.py:118 sphinx/domains/python.py:285
+#: sphinx/domains/javascript.py:107 sphinx/domains/python.py:318
#, python-format
msgid "%s() (%s method)"
msgstr "%s() (%s 方法)"
-#: sphinx/domains/javascript.py:120
+#: sphinx/domains/javascript.py:109
+#, fuzzy, python-format
+msgid "%s() (class)"
+msgstr "%s() (內置类)"
+
+#: sphinx/domains/javascript.py:111
#, python-format
msgid "%s (global variable or constant)"
msgstr ""
-#: sphinx/domains/javascript.py:122 sphinx/domains/python.py:323
+#: sphinx/domains/javascript.py:113 sphinx/domains/python.py:356
#, python-format
msgid "%s (%s attribute)"
msgstr "%s (%s 属性)"
-#: sphinx/domains/javascript.py:131
+#: sphinx/domains/javascript.py:122
#, fuzzy
msgid "Arguments"
msgstr "参数"
-#: sphinx/domains/javascript.py:134
+#: sphinx/domains/javascript.py:125
msgid "Throws"
msgstr ""
-#: sphinx/domains/javascript.py:167 sphinx/domains/python.py:498
+#: sphinx/domains/javascript.py:164 sphinx/domains/python.py:560
msgid "data"
msgstr ""
-#: sphinx/domains/javascript.py:168 sphinx/domains/python.py:504
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:566
msgid "attribute"
msgstr "属性"
-#: sphinx/domains/python.py:53
+#: sphinx/domains/python.py:100
#, fuzzy
msgid "Variables"
msgstr "变量"
-#: sphinx/domains/python.py:56
+#: sphinx/domains/python.py:104
msgid "Raises"
msgstr "引发"
-#: sphinx/domains/python.py:222 sphinx/domains/python.py:279
-#: sphinx/domains/python.py:291 sphinx/domains/python.py:304
+#: sphinx/domains/python.py:255 sphinx/domains/python.py:312
+#: sphinx/domains/python.py:324 sphinx/domains/python.py:337
#, python-format
msgid "%s() (in module %s)"
msgstr "%s() (在 %s 模块中)"
-#: sphinx/domains/python.py:225
+#: sphinx/domains/python.py:258
#, python-format
msgid "%s (built-in variable)"
msgstr "%s (內置变量)"
-#: sphinx/domains/python.py:226 sphinx/domains/python.py:317
+#: sphinx/domains/python.py:259 sphinx/domains/python.py:350
#, python-format
msgid "%s (in module %s)"
msgstr "%s() (在 %s 模块中)"
-#: sphinx/domains/python.py:242
+#: sphinx/domains/python.py:275
#, python-format
msgid "%s (built-in class)"
msgstr "%s (內置类)"
-#: sphinx/domains/python.py:243
+#: sphinx/domains/python.py:276
#, python-format
msgid "%s (class in %s)"
msgstr ""
-#: sphinx/domains/python.py:283
+#: sphinx/domains/python.py:316
#, python-format
msgid "%s() (%s.%s method)"
msgstr "%s() (%s.%s 方法)"
-#: sphinx/domains/python.py:295
+#: sphinx/domains/python.py:328
#, python-format
msgid "%s() (%s.%s static method)"
msgstr "%s() (%s.%s 静态方法)"
-#: sphinx/domains/python.py:298
+#: sphinx/domains/python.py:331
#, python-format
msgid "%s() (%s static method)"
msgstr "%s() (%s 静态方法)"
-#: sphinx/domains/python.py:308
+#: sphinx/domains/python.py:341
#, fuzzy, python-format
msgid "%s() (%s.%s class method)"
msgstr "%s() (%s.%s 方法)"
-#: sphinx/domains/python.py:311
+#: sphinx/domains/python.py:344
#, fuzzy, python-format
msgid "%s() (%s class method)"
msgstr "%s() (%s 方法)"
-#: sphinx/domains/python.py:321
+#: sphinx/domains/python.py:354
#, python-format
msgid "%s (%s.%s attribute)"
msgstr "%s (%s.%s 属性)"
-#: sphinx/domains/python.py:366
-msgid "Platforms: "
-msgstr "平台"
-
-#: sphinx/domains/python.py:372
+#: sphinx/domains/python.py:434
#, python-format
msgid "%s (module)"
msgstr "%s (模块)"
-#: sphinx/domains/python.py:429
+#: sphinx/domains/python.py:491
#, fuzzy
msgid "Python Module Index"
msgstr "模块索引"
-#: sphinx/domains/python.py:430
+#: sphinx/domains/python.py:492
msgid "modules"
msgstr "模块"
-#: sphinx/domains/python.py:475
+#: sphinx/domains/python.py:537
msgid "Deprecated"
msgstr "已移除"
-#: sphinx/domains/python.py:500 sphinx/locale/__init__.py:162
+#: sphinx/domains/python.py:562 sphinx/locale/__init__.py:179
msgid "exception"
msgstr "例外"
-#: sphinx/domains/python.py:501
+#: sphinx/domains/python.py:563
msgid "method"
msgstr ""
-#: sphinx/domains/python.py:502
-#, fuzzy, python-format
+#: sphinx/domains/python.py:564
msgid "class method"
-msgstr "%s() (%s 方法)"
+msgstr ""
-#: sphinx/domains/python.py:503
+#: sphinx/domains/python.py:565
msgid "static method"
msgstr "静态方法"
-#: sphinx/domains/python.py:505 sphinx/locale/__init__.py:158
+#: sphinx/domains/python.py:567 sphinx/locale/__init__.py:175
msgid "module"
msgstr "模块"
-#: sphinx/domains/rst.py:53
+#: sphinx/domains/python.py:695
+#, fuzzy
+msgid " (deprecated)"
+msgstr " (已移除)"
+
+#: sphinx/domains/rst.py:55
#, python-format
msgid "%s (directive)"
msgstr ""
-#: sphinx/domains/rst.py:55
-#, fuzzy, python-format
+#: sphinx/domains/rst.py:57
+#, python-format
msgid "%s (role)"
-msgstr "%s (模块)"
+msgstr ""
-#: sphinx/domains/rst.py:103
+#: sphinx/domains/rst.py:106
msgid "directive"
msgstr ""
-#: sphinx/domains/rst.py:104
-#, fuzzy
+#: sphinx/domains/rst.py:107
msgid "role"
-msgstr "模块"
+msgstr ""
-#: sphinx/domains/std.py:68 sphinx/domains/std.py:84
+#: sphinx/domains/std.py:70 sphinx/domains/std.py:86
#, python-format
msgid "environment variable; %s"
msgstr "环境变量; %s"
-#: sphinx/domains/std.py:160
+#: sphinx/domains/std.py:162
#, python-format
msgid "%scommand line option; %s"
msgstr "%s命令行选项; %s"
-#: sphinx/domains/std.py:328
+#: sphinx/domains/std.py:393
msgid "glossary term"
msgstr ""
-#: sphinx/domains/std.py:329
+#: sphinx/domains/std.py:394
msgid "grammar token"
msgstr ""
-#: sphinx/domains/std.py:330
+#: sphinx/domains/std.py:395
msgid "reference label"
msgstr ""
-#: sphinx/domains/std.py:331
+#: sphinx/domains/std.py:396
msgid "environment variable"
msgstr "环境变量"
-#: sphinx/domains/std.py:332
+#: sphinx/domains/std.py:397
msgid "program option"
msgstr ""
-#: sphinx/domains/std.py:360 sphinx/themes/basic/genindex-single.html:11
+#: sphinx/domains/std.py:427 sphinx/themes/basic/genindex-single.html:32
#: sphinx/themes/basic/genindex-split.html:11
#: sphinx/themes/basic/genindex-split.html:14
-#: sphinx/themes/basic/genindex.html:11 sphinx/themes/basic/genindex.html:14
-#: sphinx/themes/basic/genindex.html:50 sphinx/themes/basic/layout.html:125
-#: sphinx/writers/latex.py:173
+#: sphinx/themes/basic/genindex.html:32 sphinx/themes/basic/genindex.html:35
+#: sphinx/themes/basic/genindex.html:68 sphinx/themes/basic/layout.html:134
+#: sphinx/writers/latex.py:179 sphinx/writers/texinfo.py:456
msgid "Index"
msgstr "索引"
-#: sphinx/domains/std.py:361
+#: sphinx/domains/std.py:428
msgid "Module Index"
msgstr "模块索引"
-#: sphinx/domains/std.py:362 sphinx/themes/basic/defindex.html:25
+#: sphinx/domains/std.py:429 sphinx/themes/basic/defindex.html:25
msgid "Search Page"
msgstr "搜索页面"
-#: sphinx/ext/autodoc.py:917
+#: sphinx/ext/autodoc.py:1002
#, python-format
msgid " Bases: %s"
msgstr ""
-#: sphinx/ext/autodoc.py:950
+#: sphinx/ext/autodoc.py:1038
#, python-format
msgid "alias of :class:`%s`"
msgstr ""
@@ -398,112 +418,112 @@ msgid "Todo"
msgstr "待处理"
#: sphinx/ext/todo.py:109
-#, fuzzy, python-format
+#, python-format
msgid "(The <<original entry>> is located in %s, line %d.)"
-msgstr "(最初的入口位于%s 的第%d行"
+msgstr ""
#: sphinx/ext/todo.py:117
msgid "original entry"
msgstr ""
-#: sphinx/ext/viewcode.py:66
+#: sphinx/ext/viewcode.py:70
msgid "[source]"
msgstr ""
-#: sphinx/ext/viewcode.py:109
+#: sphinx/ext/viewcode.py:117
msgid "[docs]"
msgstr ""
-#: sphinx/ext/viewcode.py:123
+#: sphinx/ext/viewcode.py:131
#, fuzzy
msgid "Module code"
msgstr "模块"
-#: sphinx/ext/viewcode.py:129
+#: sphinx/ext/viewcode.py:137
#, python-format
msgid "<h1>Source code for %s</h1>"
msgstr ""
-#: sphinx/ext/viewcode.py:156
+#: sphinx/ext/viewcode.py:164
msgid "Overview: module code"
msgstr ""
-#: sphinx/ext/viewcode.py:157
+#: sphinx/ext/viewcode.py:165
msgid "<h1>All modules for which code is available</h1>"
msgstr ""
-#: sphinx/locale/__init__.py:139
+#: sphinx/locale/__init__.py:155
msgid "Attention"
msgstr "注意"
-#: sphinx/locale/__init__.py:140
+#: sphinx/locale/__init__.py:156
msgid "Caution"
msgstr "警告"
-#: sphinx/locale/__init__.py:141
+#: sphinx/locale/__init__.py:157
msgid "Danger"
msgstr "危险"
-#: sphinx/locale/__init__.py:142
+#: sphinx/locale/__init__.py:158
msgid "Error"
msgstr "错误"
-#: sphinx/locale/__init__.py:143
+#: sphinx/locale/__init__.py:159
msgid "Hint"
msgstr "提示"
-#: sphinx/locale/__init__.py:144
+#: sphinx/locale/__init__.py:160
msgid "Important"
msgstr "重要"
-#: sphinx/locale/__init__.py:145
+#: sphinx/locale/__init__.py:161
msgid "Note"
msgstr "注解"
-#: sphinx/locale/__init__.py:146
+#: sphinx/locale/__init__.py:162
msgid "See Also"
msgstr "也可以参考"
-#: sphinx/locale/__init__.py:147
+#: sphinx/locale/__init__.py:163
msgid "Tip"
msgstr "小技巧"
-#: sphinx/locale/__init__.py:148
+#: sphinx/locale/__init__.py:164
msgid "Warning"
msgstr "警告"
-#: sphinx/locale/__init__.py:152
+#: sphinx/locale/__init__.py:168
#, python-format
msgid "New in version %s"
msgstr "%s 新版功能"
-#: sphinx/locale/__init__.py:153
+#: sphinx/locale/__init__.py:169
#, python-format
msgid "Changed in version %s"
msgstr "在 %s 版更改"
-#: sphinx/locale/__init__.py:154
+#: sphinx/locale/__init__.py:170
#, python-format
msgid "Deprecated since version %s"
msgstr "%s 版后已移除"
-#: sphinx/locale/__init__.py:159
+#: sphinx/locale/__init__.py:176
msgid "keyword"
msgstr "关键字"
-#: sphinx/locale/__init__.py:160
+#: sphinx/locale/__init__.py:177
msgid "operator"
msgstr "操作数"
-#: sphinx/locale/__init__.py:161
+#: sphinx/locale/__init__.py:178
msgid "object"
msgstr "对象"
-#: sphinx/locale/__init__.py:163
+#: sphinx/locale/__init__.py:180
msgid "statement"
msgstr "语句"
-#: sphinx/locale/__init__.py:164
+#: sphinx/locale/__init__.py:181
msgid "built-in function"
msgstr "內置函数"
@@ -512,8 +532,8 @@ msgstr "內置函数"
msgid "Table Of Contents"
msgstr "內容目录"
-#: sphinx/themes/agogo/layout.html:49 sphinx/themes/basic/layout.html:128
-#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:14
+#: sphinx/themes/agogo/layout.html:49 sphinx/themes/basic/layout.html:137
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:20
msgid "Search"
msgstr "搜索"
@@ -561,15 +581,15 @@ msgstr "快速查看所有的模块"
msgid "all functions, classes, terms"
msgstr "所的函数,类,术语"
-#: sphinx/themes/basic/genindex-single.html:14
+#: sphinx/themes/basic/genindex-single.html:35
#, python-format
msgid "Index &ndash; %(key)s"
msgstr "索引 &ndash; %(key)s"
-#: sphinx/themes/basic/genindex-single.html:46
+#: sphinx/themes/basic/genindex-single.html:63
#: sphinx/themes/basic/genindex-split.html:24
#: sphinx/themes/basic/genindex-split.html:38
-#: sphinx/themes/basic/genindex.html:56
+#: sphinx/themes/basic/genindex.html:74
msgid "Full index on one page"
msgstr "一页的全部索引"
@@ -581,39 +601,39 @@ msgstr "按照字母的索引页"
msgid "can be huge"
msgstr "可能会很多"
-#: sphinx/themes/basic/layout.html:23
+#: sphinx/themes/basic/layout.html:29
msgid "Navigation"
msgstr "导航"
-#: sphinx/themes/basic/layout.html:113
+#: sphinx/themes/basic/layout.html:122
#, python-format
msgid "Search within %(docstitle)s"
msgstr "在 %(docstitle)s 中搜索"
-#: sphinx/themes/basic/layout.html:122
+#: sphinx/themes/basic/layout.html:131
msgid "About these documents"
msgstr "关于这些文档"
-#: sphinx/themes/basic/layout.html:131
+#: sphinx/themes/basic/layout.html:140
msgid "Copyright"
msgstr "版权所有"
-#: sphinx/themes/basic/layout.html:180
+#: sphinx/themes/basic/layout.html:189
#, python-format
msgid "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
msgstr "&copy; <a href=\"%(path)s\">版权所有</a> %(copyright)s."
-#: sphinx/themes/basic/layout.html:182
+#: sphinx/themes/basic/layout.html:191
#, python-format
msgid "&copy; Copyright %(copyright)s."
msgstr "&copy; 版权所有 %(copyright)s."
-#: sphinx/themes/basic/layout.html:186
+#: sphinx/themes/basic/layout.html:195
#, python-format
msgid "Last updated on %(last_updated)s."
msgstr "最后更新日期是 %(last_updated)s."
-#: sphinx/themes/basic/layout.html:189
+#: sphinx/themes/basic/layout.html:198
#, python-format
msgid ""
"Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
@@ -641,13 +661,13 @@ msgstr "下一个主题"
msgid "next chapter"
msgstr "下一章"
-#: sphinx/themes/basic/search.html:18
+#: sphinx/themes/basic/search.html:24
msgid ""
"Please activate JavaScript to enable the search\n"
" functionality."
msgstr ""
-#: sphinx/themes/basic/search.html:23
+#: sphinx/themes/basic/search.html:29
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"
@@ -655,16 +675,15 @@ msgid ""
" containing fewer words won't appear in the result list."
msgstr "在这儿,你可以对这些文档进行搜索。向搜索框中输入你所要搜索的关键字并点击\"搜索\"。注意:搜索引擎会自动搜索所有的关键字。将不会搜索到部分关键字的页面."
-#: sphinx/themes/basic/search.html:30
+#: sphinx/themes/basic/search.html:36
msgid "search"
msgstr "搜索"
-#: sphinx/themes/basic/search.html:34
-#: sphinx/themes/basic/static/searchtools.js:489
+#: sphinx/themes/basic/search.html:40
msgid "Search Results"
msgstr "搜索结果"
-#: sphinx/themes/basic/search.html:36
+#: sphinx/themes/basic/search.html:42
msgid "Your search did not match any results."
msgstr "你的搜索没有找到任何的结果."
@@ -704,12 +723,12 @@ msgstr "C API 更改"
msgid "Other changes"
msgstr "其他更改"
-#: sphinx/themes/basic/static/doctools.js:154 sphinx/writers/html.py:482
-#: sphinx/writers/html.py:487
+#: sphinx/themes/basic/static/doctools.js:154 sphinx/writers/html.py:504
+#: sphinx/writers/html.py:510
msgid "Permalink to this headline"
msgstr "永久链接至标题"
-#: sphinx/themes/basic/static/doctools.js:160 sphinx/writers/html.py:87
+#: sphinx/themes/basic/static/doctools.js:160 sphinx/writers/html.py:92
msgid "Permalink to this definition"
msgstr "永久链接至目标"
@@ -717,35 +736,12 @@ msgstr "永久链接至目标"
msgid "Hide Search Matches"
msgstr "隐藏搜索结果"
-#: sphinx/themes/basic/static/searchtools.js:285
-msgid "Searching"
-msgstr "搜索中"
-
-#: sphinx/themes/basic/static/searchtools.js:290
-msgid "Preparing search..."
-msgstr "准备搜索..."
-
-#: sphinx/themes/basic/static/searchtools.js:364
-msgid ", in "
-msgstr ", 位于"
-
-#: sphinx/themes/basic/static/searchtools.js:491
-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/themes/basic/static/searchtools.js:493
-#, python-format
-msgid "Search finished, found %s page(s) matching the search query."
-msgstr "搜索完成, 找到了 %s 页匹配所搜索的关键字"
-
-#: sphinx/themes/default/static/sidebar.js:66
+#: sphinx/themes/default/static/sidebar.js:69
msgid "Expand sidebar"
msgstr ""
-#: sphinx/themes/default/static/sidebar.js:79
-#: sphinx/themes/default/static/sidebar.js:106
+#: sphinx/themes/default/static/sidebar.js:82
+#: sphinx/themes/default/static/sidebar.js:110
msgid "Collapse sidebar"
msgstr ""
@@ -753,23 +749,25 @@ msgstr ""
msgid "Contents"
msgstr ""
-#: sphinx/writers/latex.py:171
+#: sphinx/writers/latex.py:177
msgid "Release"
msgstr "发布"
-#: sphinx/writers/latex.py:572 sphinx/writers/manpage.py:178
+#: sphinx/writers/latex.py:594 sphinx/writers/manpage.py:182
+#: sphinx/writers/texinfo.py:589
msgid "Footnotes"
msgstr ""
-#: sphinx/writers/latex.py:641
+#: sphinx/writers/latex.py:676
msgid "continued from previous page"
msgstr ""
-#: sphinx/writers/latex.py:646
+#: sphinx/writers/latex.py:681
#, fuzzy
msgid "Continued on next page"
msgstr "一页的全部索引"
-#: sphinx/writers/text.py:422
+#: sphinx/writers/text.py:437
msgid "[image]"
msgstr "[图片]"
+
diff --git a/sphinx/locale/zh_TW/LC_MESSAGES/sphinx.js b/sphinx/locale/zh_TW/LC_MESSAGES/sphinx.js
index ac64cd0b..9bfcec76 100644
--- a/sphinx/locale/zh_TW/LC_MESSAGES/sphinx.js
+++ b/sphinx/locale/zh_TW/LC_MESSAGES/sphinx.js
@@ -1 +1 @@
-Documentation.addTranslations({"locale": "zh_TW", "plural_expr": "0", "messages": {"Search Results": "\u641c\u5c0b\u7d50\u679c", "Preparing search...": "\u6e96\u5099\u641c\u5c0b...", "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "", "Search finished, found %s page(s) matching the search query.": "", ", in ": "", "Expand sidebar": "", "Permalink to this headline": "", "Searching": "\u641c\u5c0b\u4e2d", "Collapse sidebar": "", "Permalink to this definition": "", "Hide Search Matches": ""}}); \ No newline at end of file
+Documentation.addTranslations({"locale": "zh_TW", "plural_expr": "0", "messages": {"Hide Search Matches": "", "Permalink to this definition": "", "Expand sidebar": "", "Permalink to this headline": "", "Collapse sidebar": ""}}); \ No newline at end of file
diff --git a/sphinx/locale/zh_TW/LC_MESSAGES/sphinx.mo b/sphinx/locale/zh_TW/LC_MESSAGES/sphinx.mo
index 008ecec0..9dd86da5 100644
--- a/sphinx/locale/zh_TW/LC_MESSAGES/sphinx.mo
+++ b/sphinx/locale/zh_TW/LC_MESSAGES/sphinx.mo
Binary files differ
diff --git a/sphinx/locale/zh_TW/LC_MESSAGES/sphinx.po b/sphinx/locale/zh_TW/LC_MESSAGES/sphinx.po
index 33dff8ca..2a4fbef0 100644
--- a/sphinx/locale/zh_TW/LC_MESSAGES/sphinx.po
+++ b/sphinx/locale/zh_TW/LC_MESSAGES/sphinx.po
@@ -7,390 +7,409 @@ msgid ""
msgstr ""
"Project-Id-Version: Sphinx 0.5\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2008-11-09 19:46+0100\n"
-"PO-Revision-Date: 2010-05-24 23:54+0200\n"
+"POT-Creation-Date: 2011-09-21 10:06+0200\n"
+"PO-Revision-Date: 2011-01-22 14:41+0100\n"
"Last-Translator: Fred Lin <gasolin@gmail.com>\n"
"Language-Team: tw <LL@li.org>\n"
"Plural-Forms: nplurals=1; plural=0\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"
+"Generated-By: Babel 0.9.6\n"
-#: sphinx/environment.py:106 sphinx/writers/latex.py:184
-#: sphinx/writers/manpage.py:67
+#: sphinx/config.py:81
+#, python-format
+msgid "%s %s documentation"
+msgstr ""
+
+#: sphinx/environment.py:119 sphinx/writers/latex.py:190
+#: sphinx/writers/manpage.py:67 sphinx/writers/texinfo.py:203
#, python-format
msgid "%B %d, %Y"
msgstr "%Y 年 %m 月 %d 日"
-#: sphinx/roles.py:174
+#: sphinx/environment.py:1625
#, python-format
-msgid "Python Enhancement Proposals!PEP %s"
+msgid "see %s"
+msgstr ""
+
+#: sphinx/environment.py:1628
+#, python-format
+msgid "see also %s"
+msgstr ""
+
+#: sphinx/roles.py:175
+#, fuzzy, python-format
+msgid "Python Enhancement Proposals; PEP %s"
msgstr "Python 建議文件!PEP %s"
-#: sphinx/builders/changes.py:72
+#: sphinx/builders/changes.py:73
msgid "Builtins"
msgstr ""
-#: sphinx/builders/changes.py:74
+#: sphinx/builders/changes.py:75
msgid "Module level"
msgstr ""
-#: sphinx/builders/html.py:266
+#: sphinx/builders/html.py:274
#, python-format
msgid "%b %d, %Y"
msgstr "%Y 年 %m 月 %d 日"
-#: sphinx/builders/html.py:285 sphinx/themes/basic/defindex.html:30
+#: sphinx/builders/html.py:293 sphinx/themes/basic/defindex.html:30
msgid "General Index"
msgstr "總索引"
-#: sphinx/builders/html.py:285
+#: sphinx/builders/html.py:293
msgid "index"
msgstr "索引"
-#: sphinx/builders/html.py:345
+#: sphinx/builders/html.py:353
msgid "next"
msgstr "下一頁"
-#: sphinx/builders/html.py:354
+#: sphinx/builders/html.py:362
msgid "previous"
msgstr "上一頁"
-#: sphinx/builders/latex.py:151
+#: sphinx/builders/latex.py:141 sphinx/builders/texinfo.py:196
msgid " (in "
msgstr ""
-#: sphinx/directives/other.py:127
+#: sphinx/directives/other.py:136
msgid "Section author: "
msgstr "Section 作者:"
-#: sphinx/directives/other.py:129
+#: sphinx/directives/other.py:138
msgid "Module author: "
msgstr "模組作者:"
-#: sphinx/directives/other.py:131
+#: sphinx/directives/other.py:140
#, fuzzy
msgid "Code author: "
msgstr "模組作者:"
-#: sphinx/directives/other.py:133
+#: sphinx/directives/other.py:142
msgid "Author: "
msgstr "作者:"
-#: sphinx/directives/other.py:238
+#: sphinx/directives/other.py:215
msgid "See also"
msgstr ""
-#: sphinx/domains/__init__.py:253
+#: sphinx/domains/__init__.py:244
#, python-format
msgid "%s %s"
msgstr ""
-#: sphinx/domains/c.py:51 sphinx/domains/python.py:49
+#: sphinx/domains/c.py:51 sphinx/domains/python.py:95
msgid "Parameters"
msgstr "參數"
-#: sphinx/domains/c.py:54 sphinx/domains/javascript.py:137
-#: sphinx/domains/python.py:59
+#: sphinx/domains/c.py:54 sphinx/domains/javascript.py:128
+#: sphinx/domains/python.py:107
msgid "Returns"
msgstr "返回"
-#: sphinx/domains/c.py:56 sphinx/domains/python.py:61
+#: sphinx/domains/c.py:56 sphinx/domains/python.py:109
msgid "Return type"
msgstr "返回類別"
-#: sphinx/domains/c.py:133
+#: sphinx/domains/c.py:141
#, python-format
msgid "%s (C function)"
msgstr "%s (C 函式)"
-#: sphinx/domains/c.py:135
+#: sphinx/domains/c.py:143
#, python-format
msgid "%s (C member)"
msgstr "%s (C 成員)"
-#: sphinx/domains/c.py:137
+#: sphinx/domains/c.py:145
#, python-format
msgid "%s (C macro)"
msgstr "%s (C 巨集)"
-#: sphinx/domains/c.py:139
+#: sphinx/domains/c.py:147
#, python-format
msgid "%s (C type)"
msgstr "%s (C 類別)"
-#: sphinx/domains/c.py:141
+#: sphinx/domains/c.py:149
#, python-format
msgid "%s (C variable)"
msgstr "%s (C 變數)"
-#: sphinx/domains/c.py:171 sphinx/domains/cpp.py:1031
-#: sphinx/domains/javascript.py:166 sphinx/domains/python.py:497
-#, python-format
+#: sphinx/domains/c.py:204 sphinx/domains/cpp.py:1060
+#: sphinx/domains/javascript.py:162 sphinx/domains/python.py:559
msgid "function"
msgstr "函式"
-#: sphinx/domains/c.py:172 sphinx/domains/cpp.py:1032
+#: sphinx/domains/c.py:205 sphinx/domains/cpp.py:1061
msgid "member"
msgstr "成員"
-#: sphinx/domains/c.py:173
+#: sphinx/domains/c.py:206
msgid "macro"
msgstr "巨集"
-#: sphinx/domains/c.py:174 sphinx/domains/cpp.py:1033
+#: sphinx/domains/c.py:207 sphinx/domains/cpp.py:1062
msgid "type"
msgstr "類別"
-#: sphinx/domains/c.py:175
+#: sphinx/domains/c.py:208
#, fuzzy
msgid "variable"
msgstr "變數"
-#: sphinx/domains/cpp.py:876
+#: sphinx/domains/cpp.py:904
#, fuzzy, python-format
msgid "%s (C++ class)"
msgstr "%s (內建類別)"
-#: sphinx/domains/cpp.py:891
+#: sphinx/domains/cpp.py:919
#, python-format
msgid "%s (C++ type)"
msgstr "%s (C++ 類別)"
-#: sphinx/domains/cpp.py:910
+#: sphinx/domains/cpp.py:938
#, python-format
msgid "%s (C++ member)"
msgstr "%s (C++ 成員)"
-#: sphinx/domains/cpp.py:962
+#: sphinx/domains/cpp.py:990
#, python-format
msgid "%s (C++ function)"
msgstr "%s (C++ 函式)"
-#: sphinx/domains/cpp.py:1030 sphinx/domains/python.py:499
+#: sphinx/domains/cpp.py:1059 sphinx/domains/javascript.py:163
+#: sphinx/domains/python.py:561
msgid "class"
msgstr ""
-#: sphinx/domains/javascript.py:117 sphinx/domains/python.py:221
+#: sphinx/domains/javascript.py:106 sphinx/domains/python.py:254
#, python-format
msgid "%s() (built-in function)"
msgstr "%s() (內建函式)"
-#: sphinx/domains/javascript.py:118 sphinx/domains/python.py:285
+#: sphinx/domains/javascript.py:107 sphinx/domains/python.py:318
#, python-format
msgid "%s() (%s method)"
msgstr "%s() (%s 方法)"
-#: sphinx/domains/javascript.py:120
+#: sphinx/domains/javascript.py:109
+#, fuzzy, python-format
+msgid "%s() (class)"
+msgstr "%s (內建類別)"
+
+#: sphinx/domains/javascript.py:111
#, python-format
msgid "%s (global variable or constant)"
msgstr ""
-#: sphinx/domains/javascript.py:122 sphinx/domains/python.py:323
+#: sphinx/domains/javascript.py:113 sphinx/domains/python.py:356
#, python-format
msgid "%s (%s attribute)"
msgstr "%s (%s 屬性)"
-#: sphinx/domains/javascript.py:131
+#: sphinx/domains/javascript.py:122
#, fuzzy
msgid "Arguments"
msgstr "參數"
-#: sphinx/domains/javascript.py:134
+#: sphinx/domains/javascript.py:125
msgid "Throws"
msgstr ""
-#: sphinx/domains/javascript.py:167 sphinx/domains/python.py:498
+#: sphinx/domains/javascript.py:164 sphinx/domains/python.py:560
msgid "data"
msgstr ""
-#: sphinx/domains/javascript.py:168 sphinx/domains/python.py:504
-#, python-format
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:566
msgid "attribute"
msgstr "屬性"
-#: sphinx/domains/python.py:53
+#: sphinx/domains/python.py:100
#, fuzzy
msgid "Variables"
msgstr "變數"
-#: sphinx/domains/python.py:56
+#: sphinx/domains/python.py:104
msgid "Raises"
msgstr ""
-#: sphinx/domains/python.py:222 sphinx/domains/python.py:279
-#: sphinx/domains/python.py:291 sphinx/domains/python.py:304
+#: sphinx/domains/python.py:255 sphinx/domains/python.py:312
+#: sphinx/domains/python.py:324 sphinx/domains/python.py:337
#, python-format
msgid "%s() (in module %s)"
msgstr "%s() (在 %s 模組中)"
-#: sphinx/domains/python.py:225
+#: sphinx/domains/python.py:258
#, python-format
msgid "%s (built-in variable)"
msgstr "%s (內建變數)"
-#: sphinx/domains/python.py:226 sphinx/domains/python.py:317
+#: sphinx/domains/python.py:259 sphinx/domains/python.py:350
#, python-format
msgid "%s (in module %s)"
msgstr "%s() (在 %s 模組中)"
-#: sphinx/domains/python.py:242
+#: sphinx/domains/python.py:275
#, python-format
msgid "%s (built-in class)"
msgstr "%s (內建類別)"
-#: sphinx/domains/python.py:243
+#: sphinx/domains/python.py:276
#, python-format
msgid "%s (class in %s)"
msgstr ""
-#: sphinx/domains/python.py:283
+#: sphinx/domains/python.py:316
#, python-format
msgid "%s() (%s.%s method)"
msgstr "%s() (%s.%s 方法)"
-#: sphinx/domains/python.py:295
+#: sphinx/domains/python.py:328
#, python-format
msgid "%s() (%s.%s static method)"
msgstr "%s() (%s.%s 靜態方法)"
-#: sphinx/domains/python.py:298
+#: sphinx/domains/python.py:331
#, python-format
msgid "%s() (%s static method)"
msgstr "%s() (%s 靜態方法)"
-#: sphinx/domains/python.py:308
+#: sphinx/domains/python.py:341
#, fuzzy, python-format
msgid "%s() (%s.%s class method)"
msgstr "%s() (%s.%s 方法)"
-#: sphinx/domains/python.py:311
+#: sphinx/domains/python.py:344
#, fuzzy, python-format
msgid "%s() (%s class method)"
msgstr "%s() (%s 方法)"
-#: sphinx/domains/python.py:321
+#: sphinx/domains/python.py:354
#, python-format
msgid "%s (%s.%s attribute)"
msgstr "%s (%s.%s 屬性)"
-#: sphinx/domains/python.py:366
-msgid "Platforms: "
-msgstr "平台"
-
-#: sphinx/domains/python.py:372
+#: sphinx/domains/python.py:434
#, python-format
msgid "%s (module)"
msgstr "%s (模組)"
-#: sphinx/domains/python.py:429
+#: sphinx/domains/python.py:491
#, fuzzy
msgid "Python Module Index"
msgstr "模組索引"
-#: sphinx/domains/python.py:430
+#: sphinx/domains/python.py:492
msgid "modules"
msgstr "模組"
-#: sphinx/domains/python.py:475
+#: sphinx/domains/python.py:537
msgid "Deprecated"
msgstr "已移除"
-#: sphinx/domains/python.py:500 sphinx/locale/__init__.py:162
+#: sphinx/domains/python.py:562 sphinx/locale/__init__.py:179
msgid "exception"
msgstr "例外"
-#: sphinx/domains/python.py:501
+#: sphinx/domains/python.py:563
msgid "method"
msgstr ""
-#: sphinx/domains/python.py:502
-#, fuzzy, python-format
+#: sphinx/domains/python.py:564
+#, fuzzy
msgid "class method"
msgstr "%s() (%s 方法)"
-#: sphinx/domains/python.py:503
-#, python-format
+#: sphinx/domains/python.py:565
msgid "static method"
msgstr "靜態方法"
-#: sphinx/domains/python.py:505 sphinx/locale/__init__.py:158
+#: sphinx/domains/python.py:567 sphinx/locale/__init__.py:175
msgid "module"
msgstr "模組"
-#: sphinx/domains/rst.py:53
+#: sphinx/domains/python.py:695
+#, fuzzy
+msgid " (deprecated)"
+msgstr "已移除"
+
+#: sphinx/domains/rst.py:55
#, python-format
msgid "%s (directive)"
msgstr ""
-#: sphinx/domains/rst.py:55
+#: sphinx/domains/rst.py:57
#, fuzzy, python-format
msgid "%s (role)"
msgstr "%s (模組)"
-#: sphinx/domains/rst.py:103
+#: sphinx/domains/rst.py:106
msgid "directive"
msgstr ""
-#: sphinx/domains/rst.py:104
+#: sphinx/domains/rst.py:107
#, fuzzy
msgid "role"
msgstr "模組"
-#: sphinx/domains/std.py:68 sphinx/domains/std.py:84
+#: sphinx/domains/std.py:70 sphinx/domains/std.py:86
#, python-format
msgid "environment variable; %s"
msgstr "環境變數; %s"
-#: sphinx/domains/std.py:160
+#: sphinx/domains/std.py:162
#, python-format
msgid "%scommand line option; %s"
msgstr "%s命令列選項; %s"
-#: sphinx/domains/std.py:328
+#: sphinx/domains/std.py:393
msgid "glossary term"
msgstr ""
-#: sphinx/domains/std.py:329
+#: sphinx/domains/std.py:394
msgid "grammar token"
msgstr ""
-#: sphinx/domains/std.py:330
+#: sphinx/domains/std.py:395
msgid "reference label"
msgstr ""
-#: sphinx/domains/std.py:331
+#: sphinx/domains/std.py:396
msgid "environment variable"
msgstr "環境變數"
-#: sphinx/domains/std.py:332
+#: sphinx/domains/std.py:397
msgid "program option"
msgstr ""
-#: sphinx/domains/std.py:360 sphinx/themes/basic/genindex-single.html:11
+#: sphinx/domains/std.py:427 sphinx/themes/basic/genindex-single.html:32
#: sphinx/themes/basic/genindex-split.html:11
#: sphinx/themes/basic/genindex-split.html:14
-#: sphinx/themes/basic/genindex.html:11 sphinx/themes/basic/genindex.html:14
-#: sphinx/themes/basic/genindex.html:50 sphinx/themes/basic/layout.html:125
-#: sphinx/writers/latex.py:173
+#: sphinx/themes/basic/genindex.html:32 sphinx/themes/basic/genindex.html:35
+#: sphinx/themes/basic/genindex.html:68 sphinx/themes/basic/layout.html:134
+#: sphinx/writers/latex.py:179 sphinx/writers/texinfo.py:456
msgid "Index"
msgstr "索引"
-#: sphinx/domains/std.py:361
+#: sphinx/domains/std.py:428
msgid "Module Index"
msgstr "模組索引"
-#: sphinx/domains/std.py:362 sphinx/themes/basic/defindex.html:25
+#: sphinx/domains/std.py:429 sphinx/themes/basic/defindex.html:25
msgid "Search Page"
msgstr "搜尋頁面"
-#: sphinx/ext/autodoc.py:917
+#: sphinx/ext/autodoc.py:1002
#, python-format
msgid " Bases: %s"
msgstr ""
-#: sphinx/ext/autodoc.py:950
+#: sphinx/ext/autodoc.py:1038
#, python-format
msgid "alias of :class:`%s`"
msgstr ""
@@ -408,104 +427,104 @@ msgstr ""
msgid "original entry"
msgstr ""
-#: sphinx/ext/viewcode.py:66
+#: sphinx/ext/viewcode.py:70
msgid "[source]"
msgstr ""
-#: sphinx/ext/viewcode.py:109
+#: sphinx/ext/viewcode.py:117
msgid "[docs]"
msgstr ""
-#: sphinx/ext/viewcode.py:123
+#: sphinx/ext/viewcode.py:131
#, fuzzy
msgid "Module code"
msgstr "模組"
-#: sphinx/ext/viewcode.py:129
+#: sphinx/ext/viewcode.py:137
#, python-format
msgid "<h1>Source code for %s</h1>"
msgstr ""
-#: sphinx/ext/viewcode.py:156
+#: sphinx/ext/viewcode.py:164
msgid "Overview: module code"
msgstr ""
-#: sphinx/ext/viewcode.py:157
+#: sphinx/ext/viewcode.py:165
msgid "<h1>All modules for which code is available</h1>"
msgstr ""
-#: sphinx/locale/__init__.py:139
+#: sphinx/locale/__init__.py:155
msgid "Attention"
msgstr "注意"
-#: sphinx/locale/__init__.py:140
+#: sphinx/locale/__init__.py:156
msgid "Caution"
msgstr "警示"
-#: sphinx/locale/__init__.py:141
+#: sphinx/locale/__init__.py:157
msgid "Danger"
msgstr "危險"
-#: sphinx/locale/__init__.py:142
+#: sphinx/locale/__init__.py:158
msgid "Error"
msgstr "錯誤"
-#: sphinx/locale/__init__.py:143
+#: sphinx/locale/__init__.py:159
msgid "Hint"
msgstr "提示"
-#: sphinx/locale/__init__.py:144
+#: sphinx/locale/__init__.py:160
msgid "Important"
msgstr "重要"
-#: sphinx/locale/__init__.py:145
+#: sphinx/locale/__init__.py:161
msgid "Note"
msgstr "註解"
-#: sphinx/locale/__init__.py:146
+#: sphinx/locale/__init__.py:162
msgid "See Also"
msgstr ""
-#: sphinx/locale/__init__.py:147
+#: sphinx/locale/__init__.py:163
msgid "Tip"
msgstr "小技巧"
-#: sphinx/locale/__init__.py:148
+#: sphinx/locale/__init__.py:164
msgid "Warning"
msgstr "警告"
-#: sphinx/locale/__init__.py:152
+#: sphinx/locale/__init__.py:168
#, python-format
msgid "New in version %s"
msgstr "%s 版新功能"
-#: sphinx/locale/__init__.py:153
+#: sphinx/locale/__init__.py:169
#, python-format
msgid "Changed in version %s"
msgstr "在 %s 版改變"
-#: sphinx/locale/__init__.py:154
+#: sphinx/locale/__init__.py:170
#, python-format
msgid "Deprecated since version %s"
msgstr "%s 版後已移除"
-#: sphinx/locale/__init__.py:159
+#: sphinx/locale/__init__.py:176
msgid "keyword"
msgstr "關鍵字"
-#: sphinx/locale/__init__.py:160
+#: sphinx/locale/__init__.py:177
msgid "operator"
msgstr "運算子"
-#: sphinx/locale/__init__.py:161
+#: sphinx/locale/__init__.py:178
msgid "object"
msgstr "物件"
-#: sphinx/locale/__init__.py:163
+#: sphinx/locale/__init__.py:180
msgid "statement"
msgstr ""
-#: sphinx/locale/__init__.py:164
+#: sphinx/locale/__init__.py:181
msgid "built-in function"
msgstr "內建函式"
@@ -514,8 +533,8 @@ msgstr "內建函式"
msgid "Table Of Contents"
msgstr "內容目錄"
-#: sphinx/themes/agogo/layout.html:49 sphinx/themes/basic/layout.html:128
-#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:14
+#: sphinx/themes/agogo/layout.html:49 sphinx/themes/basic/layout.html:137
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:20
msgid "Search"
msgstr "搜尋"
@@ -564,15 +583,15 @@ msgstr ""
msgid "all functions, classes, terms"
msgstr ""
-#: sphinx/themes/basic/genindex-single.html:14
+#: sphinx/themes/basic/genindex-single.html:35
#, python-format
msgid "Index &ndash; %(key)s"
msgstr ""
-#: sphinx/themes/basic/genindex-single.html:46
+#: sphinx/themes/basic/genindex-single.html:63
#: sphinx/themes/basic/genindex-split.html:24
#: sphinx/themes/basic/genindex-split.html:38
-#: sphinx/themes/basic/genindex.html:56
+#: sphinx/themes/basic/genindex.html:74
msgid "Full index on one page"
msgstr ""
@@ -584,39 +603,39 @@ msgstr ""
msgid "can be huge"
msgstr ""
-#: sphinx/themes/basic/layout.html:23
+#: sphinx/themes/basic/layout.html:29
msgid "Navigation"
msgstr "瀏覽"
-#: sphinx/themes/basic/layout.html:113
+#: sphinx/themes/basic/layout.html:122
#, python-format
msgid "Search within %(docstitle)s"
msgstr "在 %(docstitle)s 中搜尋"
-#: sphinx/themes/basic/layout.html:122
+#: sphinx/themes/basic/layout.html:131
msgid "About these documents"
msgstr ""
-#: sphinx/themes/basic/layout.html:131
+#: sphinx/themes/basic/layout.html:140
msgid "Copyright"
msgstr "版權所有"
-#: sphinx/themes/basic/layout.html:180
+#: sphinx/themes/basic/layout.html:189
#, python-format
msgid "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
msgstr ""
-#: sphinx/themes/basic/layout.html:182
+#: sphinx/themes/basic/layout.html:191
#, python-format
msgid "&copy; Copyright %(copyright)s."
msgstr ""
-#: sphinx/themes/basic/layout.html:186
+#: sphinx/themes/basic/layout.html:195
#, python-format
msgid "Last updated on %(last_updated)s."
msgstr "最後更新日期是 %(last_updated)s."
-#: sphinx/themes/basic/layout.html:189
+#: sphinx/themes/basic/layout.html:198
#, python-format
msgid ""
"Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
@@ -644,13 +663,13 @@ msgstr "下一個主題"
msgid "next chapter"
msgstr "下一章"
-#: sphinx/themes/basic/search.html:18
+#: sphinx/themes/basic/search.html:24
msgid ""
"Please activate JavaScript to enable the search\n"
" functionality."
msgstr ""
-#: sphinx/themes/basic/search.html:23
+#: sphinx/themes/basic/search.html:29
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"
@@ -658,16 +677,15 @@ msgid ""
" containing fewer words won't appear in the result list."
msgstr ""
-#: sphinx/themes/basic/search.html:30
+#: sphinx/themes/basic/search.html:36
msgid "search"
msgstr "搜尋"
-#: sphinx/themes/basic/search.html:34
-#: sphinx/themes/basic/static/searchtools.js:489
+#: sphinx/themes/basic/search.html:40
msgid "Search Results"
msgstr "搜尋結果"
-#: sphinx/themes/basic/search.html:36
+#: sphinx/themes/basic/search.html:42
msgid "Your search did not match any results."
msgstr ""
@@ -707,12 +725,12 @@ msgstr "C API 改變"
msgid "Other changes"
msgstr "其他改變:"
-#: sphinx/themes/basic/static/doctools.js:154 sphinx/writers/html.py:482
-#: sphinx/writers/html.py:487
+#: sphinx/themes/basic/static/doctools.js:154 sphinx/writers/html.py:504
+#: sphinx/writers/html.py:510
msgid "Permalink to this headline"
msgstr ""
-#: sphinx/themes/basic/static/doctools.js:160 sphinx/writers/html.py:87
+#: sphinx/themes/basic/static/doctools.js:160 sphinx/writers/html.py:92
msgid "Permalink to this definition"
msgstr ""
@@ -720,35 +738,12 @@ msgstr ""
msgid "Hide Search Matches"
msgstr ""
-#: sphinx/themes/basic/static/searchtools.js:285
-msgid "Searching"
-msgstr "搜尋中"
-
-#: sphinx/themes/basic/static/searchtools.js:290
-msgid "Preparing search..."
-msgstr "準備搜尋..."
-
-#: sphinx/themes/basic/static/searchtools.js:364
-msgid ", in "
-msgstr ""
-
-#: sphinx/themes/basic/static/searchtools.js:491
-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/themes/basic/static/searchtools.js:493
-#, python-format
-msgid "Search finished, found %s page(s) matching the search query."
-msgstr ""
-
-#: sphinx/themes/default/static/sidebar.js:66
+#: sphinx/themes/default/static/sidebar.js:69
msgid "Expand sidebar"
msgstr ""
-#: sphinx/themes/default/static/sidebar.js:79
-#: sphinx/themes/default/static/sidebar.js:106
+#: sphinx/themes/default/static/sidebar.js:82
+#: sphinx/themes/default/static/sidebar.js:110
msgid "Collapse sidebar"
msgstr ""
@@ -756,22 +751,24 @@ msgstr ""
msgid "Contents"
msgstr ""
-#: sphinx/writers/latex.py:171
+#: sphinx/writers/latex.py:177
msgid "Release"
msgstr "釋出"
-#: sphinx/writers/latex.py:572 sphinx/writers/manpage.py:178
+#: sphinx/writers/latex.py:594 sphinx/writers/manpage.py:182
+#: sphinx/writers/texinfo.py:589
msgid "Footnotes"
msgstr ""
-#: sphinx/writers/latex.py:641
+#: sphinx/writers/latex.py:676
msgid "continued from previous page"
msgstr ""
-#: sphinx/writers/latex.py:646
+#: sphinx/writers/latex.py:681
msgid "Continued on next page"
msgstr ""
-#: sphinx/writers/text.py:422
+#: sphinx/writers/text.py:437
msgid "[image]"
msgstr "[圖片]"
+
diff --git a/sphinx/pycode/__init__.py b/sphinx/pycode/__init__.py
index 403269cd..09f7e220 100644
--- a/sphinx/pycode/__init__.py
+++ b/sphinx/pycode/__init__.py
@@ -10,12 +10,12 @@
"""
from os import path
-from cStringIO import StringIO
from sphinx.errors import PycodeError
from sphinx.pycode import nodes
from sphinx.pycode.pgen2 import driver, token, tokenize, parse, literals
from sphinx.util import get_module_source, detect_encoding
+from sphinx.util.pycompat import next, StringIO, BytesIO, TextIOWrapper
from sphinx.util.docstrings import prepare_docstring, prepare_commentdoc
@@ -78,10 +78,30 @@ class AttrDocVisitor(nodes.NodeVisitor):
self.in_init -= 1
def visit_expr_stmt(self, node):
- """Visit an assignment which may have a special comment before it."""
+ """Visit an assignment which may have a special comment before (or
+ after) it.
+ """
if _eq not in node.children:
# not an assignment (we don't care for augmented assignments)
return
+ # look *after* the node; there may be a comment prefixing the NEWLINE
+ # of the simple_stmt
+ parent = node.parent
+ idx = parent.children.index(node) + 1
+ while idx < len(parent):
+ if parent[idx].type == sym.SEMI:
+ idx += 1
+ continue # skip over semicolon
+ if parent[idx].type == sym.NEWLINE:
+ prefix = parent[idx].get_prefix()
+ if not isinstance(prefix, unicode):
+ prefix = prefix.decode(self.encoding)
+ docstring = prepare_commentdoc(prefix)
+ if docstring:
+ self.add_docstring(node, docstring)
+ return # don't allow docstrings both before and after
+ break
+ # now look *before* the node
pnode = node[0]
prefix = pnode.get_prefix()
# if the assignment is the first statement on a new indentation
@@ -92,7 +112,8 @@ class AttrDocVisitor(nodes.NodeVisitor):
if not pnode or pnode.type not in (token.INDENT, token.DEDENT):
break
prefix = pnode.get_prefix()
- prefix = prefix.decode(self.encoding)
+ if not isinstance(prefix, unicode):
+ prefix = prefix.decode(self.encoding)
docstring = prepare_commentdoc(prefix)
self.add_docstring(node, docstring)
@@ -148,14 +169,16 @@ class ModuleAnalyzer(object):
@classmethod
def for_string(cls, string, modname, srcname='<string>'):
- return cls(StringIO(string), modname, srcname)
+ if isinstance(string, bytes):
+ return cls(BytesIO(string), modname, srcname)
+ return cls(StringIO(string), modname, srcname, decoded=True)
@classmethod
def for_file(cls, filename, modname):
if ('file', filename) in cls.cache:
return cls.cache['file', filename]
try:
- fileobj = open(filename, 'r')
+ fileobj = open(filename, 'rb')
except Exception, err:
raise PycodeError('error opening %r' % filename, err)
obj = cls(fileobj, modname, filename)
@@ -182,7 +205,7 @@ class ModuleAnalyzer(object):
cls.cache['module', modname] = obj
return obj
- def __init__(self, source, modname, srcname):
+ def __init__(self, source, modname, srcname, decoded=False):
# name of the module
self.modname = modname
# name of the source file
@@ -192,10 +215,16 @@ class ModuleAnalyzer(object):
# cache the source code as well
pos = self.source.tell()
- self.encoding = detect_encoding(self.source.readline)
- self.source.seek(pos)
- self.code = self.source.read()
- self.source.seek(pos)
+ if not decoded:
+ self.encoding = detect_encoding(self.source.readline)
+ self.source.seek(pos)
+ self.code = self.source.read().decode(self.encoding)
+ self.source.seek(pos)
+ self.source = TextIOWrapper(self.source, self.encoding)
+ else:
+ self.encoding = None
+ self.code = self.source.read()
+ self.source.seek(pos)
# will be filled by tokenize()
self.tokens = None
@@ -265,7 +294,7 @@ class ModuleAnalyzer(object):
result[fullname] = (dtype, startline, endline)
expect_indent = False
if tok in ('def', 'class'):
- name = tokeniter.next()[1]
+ name = next(tokeniter)[1]
namespace.append(name)
fullname = '.'.join(namespace)
stack.append((tok, fullname, spos[0], indent))
diff --git a/sphinx/pycode/nodes.py b/sphinx/pycode/nodes.py
index 14388f37..7adacc1d 100644
--- a/sphinx/pycode/nodes.py
+++ b/sphinx/pycode/nodes.py
@@ -29,6 +29,8 @@ class BaseNode(object):
return NotImplemented
return not self._eq(other)
+ __hash__ = None
+
def get_prev_sibling(self):
"""Return previous child in parent's children, or None."""
if self.parent is None:
diff --git a/sphinx/pycode/pgen2/literals.py b/sphinx/pycode/pgen2/literals.py
index 31900291..d4893702 100644
--- a/sphinx/pycode/pgen2/literals.py
+++ b/sphinx/pycode/pgen2/literals.py
@@ -66,7 +66,7 @@ uni_escape_re = re.compile(r"\\(\'|\"|\\|[abfnrtv]|x.{0,2}|[0-7]{1,3}|"
def evalString(s, encoding=None):
regex = escape_re
repl = escape
- if encoding:
+ if encoding and not isinstance(s, unicode):
s = s.decode(encoding)
if s.startswith('u') or s.startswith('U'):
regex = uni_escape_re
diff --git a/sphinx/pycode/pgen2/tokenize.py b/sphinx/pycode/pgen2/tokenize.py
index 4489db89..7ad9f012 100644
--- a/sphinx/pycode/pgen2/tokenize.py
+++ b/sphinx/pycode/pgen2/tokenize.py
@@ -143,7 +143,9 @@ class TokenError(Exception): pass
class StopTokenizing(Exception): pass
-def printtoken(type, token, (srow, scol), (erow, ecol), line): # for testing
+def printtoken(type, token, scell, ecell, line): # for testing
+ srow, scol = scell
+ erow, ecol = ecell
print "%d,%d-%d,%d:\t%s\t%s" % \
(srow, scol, erow, ecol, tok_name[type], repr(token))
diff --git a/sphinx/pygments_styles.py b/sphinx/pygments_styles.py
new file mode 100644
index 00000000..44740b31
--- /dev/null
+++ b/sphinx/pygments_styles.py
@@ -0,0 +1,96 @@
+# -*- coding: utf-8 -*-
+"""
+ sphinx.pygments_styles
+ ~~~~~~~~~~~~~~~~~~~~~~
+
+ Sphinx theme specific highlighting styles.
+
+ :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
+ :license: BSD, see LICENSE for details.
+"""
+
+from pygments.style import Style
+from pygments.styles.friendly import FriendlyStyle
+from pygments.token import Generic, Comment, Number, Whitespace, Keyword, \
+ Operator, Name, String, Error
+
+
+class NoneStyle(Style):
+ """Style without any styling."""
+
+
+class SphinxStyle(Style):
+ """
+ Like friendly, but a bit darker to enhance contrast on the green
+ background.
+ """
+
+ background_color = '#eeffcc'
+ default_style = ''
+
+ styles = FriendlyStyle.styles
+ styles.update({
+ Generic.Output: '#333',
+ Comment: 'italic #408090',
+ Number: '#208050',
+ })
+
+
+class PyramidStyle(Style):
+ """
+ Pylons/pyramid pygments style based on friendly style, by Blaise Laflamme.
+ """
+
+ # work in progress...
+
+ background_color = "#f8f8f8"
+ default_style = ""
+
+ styles = {
+ Whitespace: "#bbbbbb",
+ Comment: "italic #60a0b0",
+ Comment.Preproc: "noitalic #007020",
+ Comment.Special: "noitalic bg:#fff0f0",
+
+ Keyword: "bold #007020",
+ Keyword.Pseudo: "nobold",
+ Keyword.Type: "nobold #902000",
+
+ Operator: "#666666",
+ Operator.Word: "bold #007020",
+
+ Name.Builtin: "#007020",
+ Name.Function: "#06287e",
+ Name.Class: "bold #0e84b5",
+ Name.Namespace: "bold #0e84b5",
+ Name.Exception: "#007020",
+ Name.Variable: "#bb60d5",
+ Name.Constant: "#60add5",
+ Name.Label: "bold #002070",
+ Name.Entity: "bold #d55537",
+ Name.Attribute: "#0e84b5",
+ Name.Tag: "bold #062873",
+ Name.Decorator: "bold #555555",
+
+ String: "#4070a0",
+ String.Doc: "italic",
+ String.Interpol: "italic #70a0d0",
+ String.Escape: "bold #4070a0",
+ String.Regex: "#235388",
+ String.Symbol: "#517918",
+ String.Other: "#c65d09",
+ Number: "#40a070",
+
+ Generic.Heading: "bold #000080",
+ Generic.Subheading: "bold #800080",
+ Generic.Deleted: "#A00000",
+ Generic.Inserted: "#00A000",
+ Generic.Error: "#FF0000",
+ Generic.Emph: "italic",
+ Generic.Strong: "bold",
+ Generic.Prompt: "bold #c65d09",
+ Generic.Output: "#888",
+ Generic.Traceback: "#04D",
+
+ Error: "#a40000 bg:#fbe3e4"
+ }
diff --git a/sphinx/quickstart.py b/sphinx/quickstart.py
index 27189a66..ecb46040 100644
--- a/sphinx/quickstart.py
+++ b/sphinx/quickstart.py
@@ -9,8 +9,9 @@
:license: BSD, see LICENSE for details.
"""
-import sys, os, time
+import sys, os, time, re
from os import path
+from codecs import open
TERM_ENCODING = getattr(sys.stdin, 'encoding', None)
@@ -20,10 +21,23 @@ from sphinx.util.console import purple, bold, red, turquoise, \
nocolor, color_terminal
from sphinx.util import texescape
+# function to get input from terminal -- overridden by the test suite
+try:
+ # this raw_input is not converted by 2to3
+ term_input = raw_input
+except NameError:
+ term_input = input
+
PROMPT_PREFIX = '> '
-QUICKSTART_CONF = '''\
+if sys.version_info >= (3, 0):
+ # prevents that the file is checked for being written in Python 2.x syntax
+ QUICKSTART_CONF = '#!/usr/bin/env python3\n'
+else:
+ QUICKSTART_CONF = ''
+
+QUICKSTART_CONF += '''\
# -*- coding: utf-8 -*-
#
# %(project)s documentation build configuration file, created by
@@ -195,11 +209,16 @@ htmlhelp_basename = '%(project_fn)sdoc'
# -- Options for LaTeX output --------------------------------------------------
-# The paper size ('letter' or 'a4').
-#latex_paper_size = 'letter'
+latex_elements = {
+# The paper size ('letterpaper' or 'a4paper').
+#'papersize': 'letterpaper',
# The font size ('10pt', '11pt' or '12pt').
-#latex_font_size = '10pt'
+#'pointsize': '10pt',
+
+# Additional stuff for the LaTeX preamble.
+#'preamble': '',
+}
# Grouping the document tree into LaTeX files. List of tuples
# (source start file, target name, title, author, documentclass [howto/manual]).
@@ -222,9 +241,6 @@ latex_documents = [
# If true, show URL addresses after external links.
#latex_show_urls = False
-# Additional stuff for the LaTeX preamble.
-#latex_preamble = ''
-
# Documents to append as an appendix to all manuals.
#latex_appendices = []
@@ -237,9 +253,32 @@ latex_documents = [
# One entry per manual page. List of tuples
# (source start file, name, description, authors, manual section).
man_pages = [
- ('%(master_str)s', '%(project_manpage)s', u'%(project_doc)s',
+ ('%(master_str)s', '%(project_manpage)s', u'%(project_doc_str)s',
[u'%(author_str)s'], 1)
]
+
+# If true, show URL addresses after external links.
+#man_show_urls = False
+
+
+# -- Options for Texinfo output ------------------------------------------------
+
+# Grouping the document tree into Texinfo files. List of tuples
+# (source start file, target name, title, author,
+# dir menu entry, description, category)
+texinfo_documents = [
+ ('%(master_str)s', '%(project_fn)s', u'%(project_doc_str)s', u'%(author_str)s',
+ '%(project_fn)s', 'One line description of project.', 'Miscellaneous'),
+]
+
+# Documents to append as an appendix to all manuals.
+#texinfo_appendices = []
+
+# If false, no module index is generated.
+#texinfo_domain_indices = True
+
+# How to display URL addresses: 'footnote', 'no', or 'inline'.
+#texinfo_show_urls = 'footnote'
'''
EPUB_CONFIG = '''
@@ -266,6 +305,9 @@ epub_copyright = u'%(copyright_str)s'
# A unique identification for the text.
#epub_uid = ''
+# A tuple containing the cover image and cover page html template filenames.
+#epub_cover = ()
+
# HTML files that should be inserted before the pages created by sphinx.
# The format is a list of tuples containing the path and title.
#epub_pre_files = []
@@ -297,12 +339,14 @@ MASTER_FILE = '''\
contain the root `toctree` directive.
Welcome to %(project)s's documentation!
-===========%(underline)s=================
+===========%(project_underline)s=================
Contents:
.. toctree::
- :maxdepth: 2
+ :maxdepth: %(mastertocmaxdepth)s
+
+%(mastertoctree)s
Indices and tables
==================
@@ -328,9 +372,11 @@ PAPEROPT_a4 = -D latex_paper_size=a4
PAPEROPT_letter = -D latex_paper_size=letter
ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) \
$(SPHINXOPTS) %(rsrcdir)s
+# the i18n builder cannot share the environment and doctrees with the others
+I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) %(rsrcdir)s
.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp \
-epub latex latexpdf text man changes linkcheck doctest
+epub latex latexpdf text man changes linkcheck doctest gettext
help:
\t@echo "Please use \\`make <target>' where <target> is one of"
@@ -347,6 +393,9 @@ help:
\t@echo " latexpdf to make LaTeX files and run them through pdflatex"
\t@echo " text to make text files"
\t@echo " man to make manual pages"
+\t@echo " texinfo to make Texinfo files"
+\t@echo " info to make Texinfo files and run them through makeinfo"
+\t@echo " gettext to make PO message catalogs"
\t@echo " changes to make an overview of all changed/added/deprecated items"
\t@echo " linkcheck to check all external links for integrity"
\t@echo " doctest to run all doctests embedded in the documentation \
@@ -433,6 +482,24 @@ man:
\t@echo
\t@echo "Build finished. The manual pages are in $(BUILDDIR)/man."
+texinfo:
+\t$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
+\t@echo
+\t@echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo."
+\t@echo "Run \\`make' in that directory to run these through makeinfo" \\
+\t "(use \\`make info' here to do that automatically)."
+
+info:
+\t$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
+\t@echo "Running Texinfo files through makeinfo..."
+\tmake -C $(BUILDDIR)/texinfo info
+\t@echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo."
+
+gettext:
+\t$(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale
+\t@echo
+\t@echo "Build finished. The message catalogs are in $(BUILDDIR)/locale."
+
changes:
\t$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
\t@echo
@@ -460,8 +527,10 @@ if "%%SPHINXBUILD%%" == "" (
)
set BUILDDIR=%(rbuilddir)s
set ALLSPHINXOPTS=-d %%BUILDDIR%%/doctrees %%SPHINXOPTS%% %(rsrcdir)s
+set I18NSPHINXOPTS=%%SPHINXOPTS%% %(rsrcdir)s
if NOT "%%PAPER%%" == "" (
\tset ALLSPHINXOPTS=-D latex_paper_size=%%PAPER%% %%ALLSPHINXOPTS%%
+\tset I18NSPHINXOPTS=-D latex_paper_size=%%PAPER%% %%I18NSPHINXOPTS%%
)
if "%%1" == "" goto help
@@ -481,6 +550,8 @@ if "%%1" == "help" (
\techo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter
\techo. text to make text files
\techo. man to make manual pages
+\techo. texinfo to make Texinfo files
+\techo. gettext to make PO message catalogs
\techo. changes to make an overview over all changed/added/deprecated items
\techo. linkcheck to check all external links for integrity
\techo. doctest to run all doctests embedded in the documentation if enabled
@@ -594,6 +665,22 @@ if "%%1" == "man" (
\tgoto end
)
+if "%%1" == "texinfo" (
+\t%%SPHINXBUILD%% -b texinfo %%ALLSPHINXOPTS%% %%BUILDDIR%%/texinfo
+\tif errorlevel 1 exit /b 1
+\techo.
+\techo.Build finished. The Texinfo files are in %%BUILDDIR%%/texinfo.
+\tgoto end
+)
+
+if "%%1" == "gettext" (
+\t%%SPHINXBUILD%% -b gettext %%I18NSPHINXOPTS%% %%BUILDDIR%%/locale
+\tif errorlevel 1 exit /b 1
+\techo.
+\techo.Build finished. The message catalogs are in %%BUILDDIR%%/locale.
+\tgoto end
+)
+
if "%%1" == "changes" (
\t%%SPHINXBUILD%% -b changes %%ALLSPHINXOPTS%% %%BUILDDIR%%/changes
\tif errorlevel 1 exit /b 1
@@ -671,20 +758,22 @@ def do_prompt(d, key, text, default=None, validator=nonempty):
prompt = purple(PROMPT_PREFIX + '%s [%s]: ' % (text, default))
else:
prompt = purple(PROMPT_PREFIX + text + ': ')
- x = raw_input(prompt)
+ x = term_input(prompt)
if default and not x:
x = default
- if x.decode('ascii', 'replace').encode('ascii', 'replace') != x:
- if TERM_ENCODING:
- x = x.decode(TERM_ENCODING)
- else:
- print turquoise('* Note: non-ASCII characters entered '
- 'and terminal encoding unknown -- assuming '
- 'UTF-8 or Latin-1.')
- try:
- x = x.decode('utf-8')
- except UnicodeDecodeError:
- x = x.decode('latin1')
+ if not isinstance(x, unicode):
+ # for Python 2.x, try to get a Unicode string out of it
+ if x.decode('ascii', 'replace').encode('ascii', 'replace') != x:
+ if TERM_ENCODING:
+ x = x.decode(TERM_ENCODING)
+ else:
+ print turquoise('* Note: non-ASCII characters entered '
+ 'and terminal encoding unknown -- assuming '
+ 'UTF-8 or Latin-1.')
+ try:
+ x = x.decode('utf-8')
+ except UnicodeDecodeError:
+ x = x.decode('latin1')
try:
x = validator(x)
except ValidationError, err:
@@ -694,21 +783,50 @@ def do_prompt(d, key, text, default=None, validator=nonempty):
d[key] = x
-def inner_main(args):
- d = {}
- texescape.init()
+if sys.version_info >= (3, 0):
+ # remove Unicode literal prefixes
+ _unicode_string_re = re.compile(r"[uU]('.*?')")
+ def _convert_python_source(source):
+ return _unicode_string_re.sub('\\1', source)
- if not color_terminal():
- nocolor()
+ for f in ['QUICKSTART_CONF', 'EPUB_CONFIG', 'INTERSPHINX_CONFIG']:
+ globals()[f] = _convert_python_source(globals()[f])
+
+ del _unicode_string_re, _convert_python_source
+
+
+def ask_user(d):
+ """Ask the user for quickstart values missing from *d*.
+
+ Values are:
+
+ * path: root path
+ * sep: separate source and build dirs (bool)
+ * dot: replacement for dot in _templates etc.
+ * project: project name
+ * author: author names
+ * version: version of project
+ * release: release of project
+ * suffix: source file suffix
+ * master: master document name
+ * epub: use epub (bool)
+ * ext_*: extensions to use (bools)
+ * makefile: make Makefile
+ * batchfile: make command file
+ """
print bold('Welcome to the Sphinx %s quickstart utility.') % __version__
print '''
Please enter values for the following settings (just press Enter to
accept a default value, if one is given in brackets).'''
- print '''
+ if 'path' in d:
+ print bold('''
+Selected root path: %s''' % d['path'])
+ else:
+ print '''
Enter the root path for documentation.'''
- do_prompt(d, 'path', 'Root path for the documentation', '.', is_path)
+ do_prompt(d, 'path', 'Root path for the documentation', '.', is_path)
while path.isfile(path.join(d['path'], 'conf.py')) or \
path.isfile(path.join(d['path'], 'source', 'conf.py')):
@@ -722,42 +840,53 @@ Enter the root path for documentation.'''
if not d['path']:
sys.exit(1)
- print '''
+ if 'sep' not in d:
+ print '''
You have two options for placing the build directory for Sphinx output.
Either, you use a directory "_build" within the root path, or you separate
"source" and "build" directories within the root path.'''
- do_prompt(d, 'sep', 'Separate source and build directories (y/N)', 'n',
- boolean)
+ do_prompt(d, 'sep', 'Separate source and build directories (y/N)', 'n',
+ boolean)
- print '''
+ if 'dot' not in d:
+ print '''
Inside the root directory, two more directories will be created; "_templates"
for custom HTML templates and "_static" for custom stylesheets and other static
files. You can enter another prefix (such as ".") to replace the underscore.'''
- do_prompt(d, 'dot', 'Name prefix for templates and static dir', '_', ok)
+ do_prompt(d, 'dot', 'Name prefix for templates and static dir', '_', ok)
- print '''
+ if 'project' not in d:
+ print '''
The project name will occur in several places in the built documentation.'''
- do_prompt(d, 'project', 'Project name')
- do_prompt(d, 'author', 'Author name(s)')
- print '''
+ do_prompt(d, 'project', 'Project name')
+ if 'author' not in d:
+ do_prompt(d, 'author', 'Author name(s)')
+
+ if 'version' not in d:
+ print '''
Sphinx has the notion of a "version" and a "release" for the
software. Each version can have multiple releases. For example, for
Python the version is something like 2.5 or 3.0, while the release is
something like 2.5.1 or 3.0a1. If you don't need this dual structure,
just set both to the same value.'''
- do_prompt(d, 'version', 'Project version')
- do_prompt(d, 'release', 'Project release', d['version'])
- print '''
+ do_prompt(d, 'version', 'Project version')
+ if 'release' not in d:
+ do_prompt(d, 'release', 'Project release', d['version'])
+
+ if 'suffix' not in d:
+ print '''
The file name suffix for source files. Commonly, this is either ".txt"
or ".rst". Only files with this suffix are considered documents.'''
- do_prompt(d, 'suffix', 'Source file suffix', '.rst', suffix)
- print '''
+ do_prompt(d, 'suffix', 'Source file suffix', '.rst', suffix)
+
+ if 'master' not in d:
+ print '''
One document is special in that it is considered the top node of the
"contents tree", that is, it is the root of the hierarchical structure
of the documents. Normally, this is "index", but if your "index"
document is a custom template, you can also set this to another filename.'''
- do_prompt(d, 'master', 'Name of your master document (without suffix)',
- 'index')
+ do_prompt(d, 'master', 'Name of your master document (without suffix)',
+ 'index')
while path.isfile(path.join(d['path'], d['master']+d['suffix'])) or \
path.isfile(path.join(d['path'], 'source', d['master']+d['suffix'])):
@@ -769,51 +898,76 @@ document is a custom template, you can also set this to another filename.'''
do_prompt(d, 'master', 'Please enter a new file name, or rename the '
'existing file and press Enter', d['master'])
- print '''
+ if 'epub' not in d:
+ print '''
Sphinx can also add configuration for epub output:'''
- do_prompt(d, 'epub', 'Do you want to use the epub builder (y/N)',
- 'n', boolean)
+ do_prompt(d, 'epub', 'Do you want to use the epub builder (y/N)',
+ 'n', boolean)
- print '''
+ if 'ext_autodoc' not in d:
+ print '''
Please indicate if you want to use one of the following Sphinx extensions:'''
- do_prompt(d, 'ext_autodoc', 'autodoc: automatically insert docstrings '
- 'from modules (y/N)', 'n', boolean)
- do_prompt(d, 'ext_doctest', 'doctest: automatically test code snippets '
- 'in doctest blocks (y/N)', 'n', boolean)
- do_prompt(d, 'ext_intersphinx', 'intersphinx: link between Sphinx '
- 'documentation of different projects (y/N)', 'n', boolean)
- do_prompt(d, 'ext_todo', 'todo: write "todo" entries '
- 'that can be shown or hidden on build (y/N)', 'n', boolean)
- do_prompt(d, 'ext_coverage', 'coverage: checks for documentation '
- 'coverage (y/N)', 'n', boolean)
- do_prompt(d, 'ext_pngmath', 'pngmath: include math, rendered '
- 'as PNG images (y/N)', 'n', boolean)
- do_prompt(d, 'ext_jsmath', 'jsmath: include math, rendered in the '
- 'browser by JSMath (y/N)', 'n', boolean)
- if d['ext_pngmath'] and d['ext_jsmath']:
- print '''Note: pngmath and jsmath cannot be enabled at the same time.
+ do_prompt(d, 'ext_autodoc', 'autodoc: automatically insert docstrings '
+ 'from modules (y/N)', 'n', boolean)
+ if 'ext_doctest' not in d:
+ do_prompt(d, 'ext_doctest', 'doctest: automatically test code snippets '
+ 'in doctest blocks (y/N)', 'n', boolean)
+ if 'ext_intersphinx' not in d:
+ do_prompt(d, 'ext_intersphinx', 'intersphinx: link between Sphinx '
+ 'documentation of different projects (y/N)', 'n', boolean)
+ if 'ext_todo' not in d:
+ do_prompt(d, 'ext_todo', 'todo: write "todo" entries '
+ 'that can be shown or hidden on build (y/N)', 'n', boolean)
+ if 'ext_coverage' not in d:
+ do_prompt(d, 'ext_coverage', 'coverage: checks for documentation '
+ 'coverage (y/N)', 'n', boolean)
+ if 'ext_pngmath' not in d:
+ do_prompt(d, 'ext_pngmath', 'pngmath: include math, rendered '
+ 'as PNG images (y/N)', 'n', boolean)
+ if 'ext_mathjax' not in d:
+ do_prompt(d, 'ext_mathjax', 'mathjax: include math, rendered in the '
+ 'browser by MathJax (y/N)', 'n', boolean)
+ if d['ext_pngmath'] and d['ext_mathjax']:
+ print '''Note: pngmath and mathjax cannot be enabled at the same time.
pngmath has been deselected.'''
- do_prompt(d, 'ext_ifconfig', 'ifconfig: conditional inclusion of '
- 'content based on config values (y/N)', 'n', boolean)
- do_prompt(d, 'ext_viewcode', 'viewcode: include links to the source code '
- 'of documented Python objects (y/N)', 'n', boolean)
- print '''
+ if 'ext_ifconfig' not in d:
+ do_prompt(d, 'ext_ifconfig', 'ifconfig: conditional inclusion of '
+ 'content based on config values (y/N)', 'n', boolean)
+ if 'ext_viewcode' not in d:
+ do_prompt(d, 'ext_viewcode', 'viewcode: include links to the source code '
+ 'of documented Python objects (y/N)', 'n', boolean)
+
+ if 'makefile' not in d:
+ print '''
A Makefile and a Windows command file can be generated for you so that you
only have to run e.g. `make html' instead of invoking sphinx-build
directly.'''
- do_prompt(d, 'makefile', 'Create Makefile? (Y/n)', 'y', boolean)
- do_prompt(d, 'batchfile', 'Create Windows command file? (Y/n)',
- 'y', boolean)
+ do_prompt(d, 'makefile', 'Create Makefile? (Y/n)', 'y', boolean)
+ if 'batchfile' not in d:
+ do_prompt(d, 'batchfile', 'Create Windows command file? (Y/n)',
+ 'y', boolean)
+ print
+
+
+def generate(d, overwrite=True, silent=False):
+ """Generate project based on values in *d*."""
+
+ texescape.init()
+
+ if 'mastertoctree' not in d:
+ d['mastertoctree'] = ''
+ if 'mastertocmaxdepth' not in d:
+ d['mastertocmaxdepth'] = 2
d['project_fn'] = make_filename(d['project'])
d['project_manpage'] = d['project_fn'].lower()
d['now'] = time.asctime()
- d['underline'] = len(d['project']) * '='
+ d['project_underline'] = len(d['project']) * '='
d['extensions'] = ', '.join(
repr('sphinx.ext.' + name)
for name in ('autodoc', 'doctest', 'intersphinx', 'todo', 'coverage',
- 'pngmath', 'jsmath', 'ifconfig', 'viewcode')
- if d['ext_' + name])
+ 'pngmath', 'mathjax', 'ifconfig', 'viewcode')
+ if d.get('ext_' + name))
d['copyright'] = time.strftime('%Y') + ', ' + d['author']
d['author_texescaped'] = unicode(d['author']).\
translate(texescape.tex_escape_map)
@@ -823,8 +977,9 @@ directly.'''
# escape backslashes and single quotes in strings that are put into
# a Python string literal
- for key in ('project', 'copyright', 'author', 'author_texescaped',
- 'project_doc_texescaped', 'version', 'release', 'master'):
+ for key in ('project', 'project_doc', 'project_doc_texescaped',
+ 'author', 'author_texescaped', 'copyright',
+ 'version', 'release', 'master'):
d[key + '_str'] = d[key].replace('\\', '\\\\').replace("'", "\\'")
if not path.isdir(d['path']):
@@ -843,36 +998,41 @@ directly.'''
mkdir_p(path.join(srcdir, d['dot'] + 'templates'))
mkdir_p(path.join(srcdir, d['dot'] + 'static'))
+ def write_file(fpath, mode, content):
+ if overwrite or not path.isfile(fpath):
+ print 'Creating file %s.' % fpath
+ f = open(fpath, mode, encoding='utf-8')
+ try:
+ f.write(content)
+ finally:
+ f.close()
+ else:
+ print 'File %s already exists, skipping.' % fpath
+
conf_text = QUICKSTART_CONF % d
if d['epub']:
conf_text += EPUB_CONFIG % d
- if d['ext_intersphinx']:
+ if d.get('ext_intersphinx'):
conf_text += INTERSPHINX_CONFIG
- f = open(path.join(srcdir, 'conf.py'), 'w')
- f.write(conf_text.encode('utf-8'))
- f.close()
+ write_file(path.join(srcdir, 'conf.py'), 'w', conf_text)
masterfile = path.join(srcdir, d['master'] + d['suffix'])
- f = open(masterfile, 'w')
- f.write((MASTER_FILE % d).encode('utf-8'))
- f.close()
+ write_file(masterfile, 'w', MASTER_FILE % d)
if d['makefile']:
d['rsrcdir'] = d['sep'] and 'source' or '.'
d['rbuilddir'] = d['sep'] and 'build' or d['dot'] + 'build'
# use binary mode, to avoid writing \r\n on Windows
- f = open(path.join(d['path'], 'Makefile'), 'wb')
- f.write((MAKEFILE % d).encode('utf-8'))
- f.close()
+ write_file(path.join(d['path'], 'Makefile'), 'wb', MAKEFILE % d)
if d['batchfile']:
d['rsrcdir'] = d['sep'] and 'source' or '.'
d['rbuilddir'] = d['sep'] and 'build' or d['dot'] + 'build'
- f = open(path.join(d['path'], 'make.bat'), 'w')
- f.write((BATCHFILE % d).encode('utf-8'))
- f.close()
+ write_file(path.join(d['path'], 'make.bat'), 'w', BATCHFILE % d)
+ if silent:
+ return
print
print bold('Finished: An initial directory structure has been created.')
print '''
@@ -889,10 +1049,19 @@ where "builder" is one of the supported builders, e.g. html, latex or linkcheck.
def main(argv=sys.argv):
+ if not color_terminal():
+ nocolor()
+
+ d = {}
+ if len(argv) > 3:
+ print 'Usage: sphinx-quickstart [root]'
+ sys.exit(1)
+ elif len(argv) == 2:
+ d['path'] = argv[1]
try:
- return inner_main(argv)
+ ask_user(d)
except (KeyboardInterrupt, EOFError):
print
print '[Interrupted.]'
return
-
+ generate(d)
diff --git a/sphinx/roles.py b/sphinx/roles.py
index 0ef3624e..312eec3f 100644
--- a/sphinx/roles.py
+++ b/sphinx/roles.py
@@ -18,7 +18,8 @@ from docutils.parsers.rst import roles
from sphinx import addnodes
from sphinx.locale import _
from sphinx.util import ws_re
-from sphinx.util.nodes import split_explicit_title, set_role_source_info
+from sphinx.util.nodes import split_explicit_title, process_index_entry, \
+ set_role_source_info
generic_docroles = {
@@ -141,16 +142,15 @@ class XRefRole(object):
# methods that can be overwritten
def process_link(self, env, refnode, has_explicit_title, title, target):
- """
- Called after parsing title and target text, and creating the reference
- node (given in *refnode*). This method can alter the reference node and
- must return a new (or the same) ``(title, target)`` tuple.
+ """Called after parsing title and target text, and creating the
+ reference node (given in *refnode*). This method can alter the
+ reference node and must return a new (or the same) ``(title, target)``
+ tuple.
"""
return title, ws_re.sub(' ', target)
def result_nodes(self, document, env, node, is_ref):
- """
- Called before returning the finished nodes. *node* is the reference
+ """Called before returning the finished nodes. *node* is the reference
node if one was created (*is_ref* is then true), else the content node.
This method can add other nodes and must return a ``(nodes, messages)``
tuple (the usual return value of a role function).
@@ -173,8 +173,8 @@ def indexmarkup_role(typ, rawtext, etext, lineno, inliner,
inliner.document.note_explicit_target(targetnode)
if typ == 'pep':
indexnode['entries'] = [
- ('single', _('Python Enhancement Proposals!PEP %s') % text,
- targetid, 'PEP %s' % text)]
+ ('single', _('Python Enhancement Proposals; PEP %s') % text,
+ targetid, '')]
anchor = ''
anchorindex = text.find('#')
if anchorindex > 0:
@@ -193,8 +193,7 @@ def indexmarkup_role(typ, rawtext, etext, lineno, inliner,
rn += sn
return [indexnode, targetnode, rn], []
elif typ == 'rfc':
- indexnode['entries'] = [('single', 'RFC; RFC %s' % text,
- targetid, 'RFC %s' % text)]
+ indexnode['entries'] = [('single', 'RFC; RFC %s' % text, targetid, '')]
anchor = ''
anchorindex = text.find('#')
if anchorindex > 0:
@@ -271,11 +270,38 @@ def abbr_role(typ, rawtext, text, lineno, inliner, options={}, content=[]):
return [addnodes.abbreviation(abbr, abbr, explanation=expl)], []
+def index_role(typ, rawtext, text, lineno, inliner, options={}, content=[]):
+ # create new reference target
+ env = inliner.document.settings.env
+ targetid = 'index-%s' % env.new_serialno('index')
+ targetnode = nodes.target('', '', ids=[targetid])
+ # split text and target in role content
+ has_explicit_title, title, target = split_explicit_title(text)
+ title = utils.unescape(title)
+ target = utils.unescape(target)
+ # if an explicit target is given, we can process it as a full entry
+ if has_explicit_title:
+ entries = process_index_entry(target, targetid)
+ # otherwise we just create a "single" entry
+ else:
+ # but allow giving main entry
+ main = ''
+ if target.startswith('!'):
+ target = target[1:]
+ title = title[1:]
+ main = 'main'
+ entries = [('single', target, targetid, main)]
+ indexnode = addnodes.index()
+ indexnode['entries'] = entries
+ textnode = nodes.Text(title, title)
+ return [indexnode, targetnode, textnode], []
+
+
specific_docroles = {
# links to download references
'download': XRefRole(nodeclass=addnodes.download_reference),
# links to documents
- 'doc': XRefRole(),
+ 'doc': XRefRole(warn_dangling=True),
'pep': indexmarkup_role,
'rfc': indexmarkup_role,
@@ -284,6 +310,7 @@ specific_docroles = {
'file': emph_literal_role,
'samp': emph_literal_role,
'abbr': abbr_role,
+ 'index': index_role,
}
for rolename, func in specific_docroles.iteritems():
diff --git a/sphinx/search.py b/sphinx/search/__init__.py
index 373c80e3..6e9610a4 100644
--- a/sphinx/search.py
+++ b/sphinx/search/__init__.py
@@ -3,7 +3,7 @@
sphinx.search
~~~~~~~~~~~~~
- Create a search index for offline search.
+ Create a full-text search index for offline search.
:copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
:license: BSD, see LICENSE for details.
@@ -14,28 +14,90 @@ import cPickle as pickle
from docutils.nodes import comment, Text, NodeVisitor, SkipNode
from sphinx.util import jsdump, rpartition
-try:
- # http://bitbucket.org/methane/porterstemmer/
- from porterstemmer import Stemmer as CStemmer
- CSTEMMER = True
-except ImportError:
- from sphinx.util.stemmer import PorterStemmer
- CSTEMMER = False
-
-
-word_re = re.compile(r'\w+(?u)')
-
-stopwords = set("""
-a and are as at
-be but by
-for
-if in into is it
-near no not
-of on or
-such
-that the their then there these they this to
-was will with
-""".split())
+
+
+class SearchLanguage(object):
+ """
+ This class is the base class for search natural language preprocessors. If
+ you want to add support for a new language, you should override the methods
+ of this class.
+
+ You should override `lang` class property too (e.g. 'en', 'fr' and so on).
+
+ .. attribute:: stopwords
+
+ This is a set of stop words of the target language. Default `stopwords`
+ is empty. This word is used for building index and embedded in JS.
+
+ .. attribute:: js_stemmer_code
+
+ Return stemmer class of JavaScript version. This class' name should be
+ ``Stemmer`` and this class must have ``stemWord`` method. This string is
+ embedded as-is in searchtools.js.
+
+ This class is used to preprocess search word which Sphinx HTML readers
+ type, before searching index. Default implementation does nothing.
+ """
+ lang = None
+ stopwords = set()
+ js_stemmer_code = """
+/**
+ * Dummy stemmer for languages without stemming rules.
+ */
+var Stemmer = function() {
+ this.stemWord = function(w) {
+ return w;
+ }
+}
+"""
+
+ _word_re = re.compile(r'\w+(?u)')
+
+ def __init__(self, options):
+ self.options = options
+ self.init(options)
+
+ def init(self, options):
+ """
+ Initialize the class with the options the user has given.
+ """
+
+ def split(self, input):
+ """
+ This method splits a sentence into words. Default splitter splits input
+ at white spaces, which should be enough for most languages except CJK
+ languages.
+ """
+ return self._word_re.findall(input)
+
+ def stem(self, word):
+ """
+ This method implements stemming algorithm of the Python version.
+
+ Default implementation does nothing. You should implement this if the
+ language has any stemming rules.
+
+ This class is used to preprocess search words before registering them in
+ the search index. The stemming of the Python version and the JS version
+ (given in the js_stemmer_code attribute) must be compatible.
+ """
+ return word
+
+ def word_filter(self, word):
+ """
+ Return true if the target word should be registered in the search index.
+ This method is called after stemming.
+ """
+ return not (((len(word) < 3) and (12353 < ord(word[0]) < 12436)) or
+ (ord(word[0]) < 256 and (len(word) < 3 or word in self.stopwords or
+ word.isdigit())))
+
+from sphinx.search import en, ja
+
+languages = {
+ 'en': en.SearchEnglish,
+ 'ja': ja.SearchJapanese,
+}
class _JavaScriptIndex(object):
@@ -67,39 +129,21 @@ class _JavaScriptIndex(object):
js_index = _JavaScriptIndex()
-if CSTEMMER:
- class Stemmer(CStemmer):
-
- def stem(self, word):
- return self(word.lower())
-
-else:
- class Stemmer(PorterStemmer):
- """
- All those porter stemmer implementations look hideous.
- make at least the stem method nicer.
- """
-
- def stem(self, word):
- word = word.lower()
- return PorterStemmer.stem(self, word, 0, len(word) - 1)
-
-
-
class WordCollector(NodeVisitor):
"""
A special visitor that collects words for the `IndexBuilder`.
"""
- def __init__(self, document):
+ def __init__(self, document, lang):
NodeVisitor.__init__(self, document)
self.found_words = []
+ self.lang = lang
def dispatch_visit(self, node):
if node.__class__ is comment:
raise SkipNode
if node.__class__ is Text:
- self.found_words.extend(word_re.findall(node.astext()))
+ self.found_words.extend(self.lang.split(node.astext()))
class IndexBuilder(object):
@@ -112,9 +156,8 @@ class IndexBuilder(object):
'pickle': pickle
}
- def __init__(self, env):
+ def __init__(self, env, lang, options):
self.env = env
- self._stemmer = Stemmer()
# filename -> title
self._titles = {}
# stemmed word -> set(filenames)
@@ -123,6 +166,8 @@ class IndexBuilder(object):
self._objtypes = {}
# objtype index -> (domain, type, objname (localized))
self._objnames = {}
+ # add language-specific SearchLanguage instance
+ self.lang = languages[lang](options)
def load(self, stream, format):
"""Reconstruct from frozen data."""
@@ -221,17 +266,22 @@ class IndexBuilder(object):
"""Feed a doctree to the index."""
self._titles[filename] = title
- visitor = WordCollector(doctree)
+ visitor = WordCollector(doctree, self.lang)
doctree.walk(visitor)
- def add_term(word, stem=self._stemmer.stem):
+ def add_term(word, stem=self.lang.stem):
word = stem(word)
- if len(word) < 3 or word in stopwords or word.isdigit():
- return
- self._mapping.setdefault(word, set()).add(filename)
+ if self.lang.word_filter(word):
+ self._mapping.setdefault(word, set()).add(filename)
- for word in word_re.findall(title):
+ for word in self.lang.split(title):
add_term(word)
for word in visitor.found_words:
add_term(word)
+
+ def context_for_searchtool(self):
+ return dict(
+ search_language_stemming_code = self.lang.js_stemmer_code,
+ search_language_stop_words = jsdump.dumps(self.lang.stopwords),
+ )
diff --git a/sphinx/search/en.py b/sphinx/search/en.py
new file mode 100644
index 00000000..1f3c3731
--- /dev/null
+++ b/sphinx/search/en.py
@@ -0,0 +1,244 @@
+# -*- coding: utf-8 -*-
+"""
+ sphinx.search.en
+ ~~~~~~~~~~~~~~~~
+
+ English search language: includes the JS porter stemmer.
+
+ :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
+ :license: BSD, see LICENSE for details.
+"""
+
+from sphinx.search import SearchLanguage
+
+try:
+ # http://bitbucket.org/methane/porterstemmer/
+ from porterstemmer import Stemmer as CStemmer
+ CSTEMMER = True
+except ImportError:
+ from sphinx.util.stemmer import PorterStemmer
+ CSTEMMER = False
+
+
+english_stopwords = set("""
+a and are as at
+be but by
+for
+if in into is it
+near no not
+of on or
+such
+that the their then there these they this to
+was will with
+""".split())
+
+js_porter_stemmer = """
+/**
+ * Porter Stemmer
+ */
+var Stemmer = function() {
+
+ var step2list = {
+ ational: 'ate',
+ tional: 'tion',
+ enci: 'ence',
+ anci: 'ance',
+ izer: 'ize',
+ bli: 'ble',
+ alli: 'al',
+ entli: 'ent',
+ eli: 'e',
+ ousli: 'ous',
+ ization: 'ize',
+ ation: 'ate',
+ ator: 'ate',
+ alism: 'al',
+ iveness: 'ive',
+ fulness: 'ful',
+ ousness: 'ous',
+ aliti: 'al',
+ iviti: 'ive',
+ biliti: 'ble',
+ logi: 'log'
+ };
+
+ var step3list = {
+ icate: 'ic',
+ ative: '',
+ alize: 'al',
+ iciti: 'ic',
+ ical: 'ic',
+ ful: '',
+ ness: ''
+ };
+
+ var c = "[^aeiou]"; // consonant
+ var v = "[aeiouy]"; // vowel
+ var C = c + "[^aeiouy]*"; // consonant sequence
+ var V = v + "[aeiou]*"; // vowel sequence
+
+ var mgr0 = "^(" + C + ")?" + V + C; // [C]VC... is m>0
+ var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1
+ var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1
+ var s_v = "^(" + C + ")?" + v; // vowel in stem
+
+ this.stemWord = function (w) {
+ var stem;
+ var suffix;
+ var firstch;
+ var origword = w;
+
+ if (w.length < 3)
+ return w;
+
+ var re;
+ var re2;
+ var re3;
+ var re4;
+
+ firstch = w.substr(0,1);
+ if (firstch == "y")
+ w = firstch.toUpperCase() + w.substr(1);
+
+ // Step 1a
+ re = /^(.+?)(ss|i)es$/;
+ re2 = /^(.+?)([^s])s$/;
+
+ if (re.test(w))
+ w = w.replace(re,"$1$2");
+ else if (re2.test(w))
+ w = w.replace(re2,"$1$2");
+
+ // Step 1b
+ re = /^(.+?)eed$/;
+ re2 = /^(.+?)(ed|ing)$/;
+ if (re.test(w)) {
+ var fp = re.exec(w);
+ re = new RegExp(mgr0);
+ if (re.test(fp[1])) {
+ re = /.$/;
+ w = w.replace(re,"");
+ }
+ }
+ else if (re2.test(w)) {
+ var fp = re2.exec(w);
+ stem = fp[1];
+ re2 = new RegExp(s_v);
+ if (re2.test(stem)) {
+ w = stem;
+ re2 = /(at|bl|iz)$/;
+ re3 = new RegExp("([^aeiouylsz])\\\\1$");
+ re4 = new RegExp("^" + C + v + "[^aeiouwxy]$");
+ if (re2.test(w))
+ w = w + "e";
+ else if (re3.test(w)) {
+ re = /.$/;
+ w = w.replace(re,"");
+ }
+ else if (re4.test(w))
+ w = w + "e";
+ }
+ }
+
+ // Step 1c
+ re = /^(.+?)y$/;
+ if (re.test(w)) {
+ var fp = re.exec(w);
+ stem = fp[1];
+ re = new RegExp(s_v);
+ if (re.test(stem))
+ w = stem + "i";
+ }
+
+ // Step 2
+ re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|\
+ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/;
+ if (re.test(w)) {
+ var fp = re.exec(w);
+ stem = fp[1];
+ suffix = fp[2];
+ re = new RegExp(mgr0);
+ if (re.test(stem))
+ w = stem + step2list[suffix];
+ }
+
+ // Step 3
+ re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/;
+ if (re.test(w)) {
+ var fp = re.exec(w);
+ stem = fp[1];
+ suffix = fp[2];
+ re = new RegExp(mgr0);
+ if (re.test(stem))
+ w = stem + step3list[suffix];
+ }
+
+ // Step 4
+ re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|\
+iti|ous|ive|ize)$/;
+ re2 = /^(.+?)(s|t)(ion)$/;
+ if (re.test(w)) {
+ var fp = re.exec(w);
+ stem = fp[1];
+ re = new RegExp(mgr1);
+ if (re.test(stem))
+ w = stem;
+ }
+ else if (re2.test(w)) {
+ var fp = re2.exec(w);
+ stem = fp[1] + fp[2];
+ re2 = new RegExp(mgr1);
+ if (re2.test(stem))
+ w = stem;
+ }
+
+ // Step 5
+ re = /^(.+?)e$/;
+ if (re.test(w)) {
+ var fp = re.exec(w);
+ stem = fp[1];
+ re = new RegExp(mgr1);
+ re2 = new RegExp(meq1);
+ re3 = new RegExp("^" + C + v + "[^aeiouwxy]$");
+ if (re.test(stem) || (re2.test(stem) && !(re3.test(stem))))
+ w = stem;
+ }
+ re = /ll$/;
+ re2 = new RegExp(mgr1);
+ if (re.test(w) && re2.test(w)) {
+ re = /.$/;
+ w = w.replace(re,"");
+ }
+
+ // and turn initial Y back to y
+ if (firstch == "y")
+ w = firstch.toLowerCase() + w.substr(1);
+ return w;
+ }
+}
+"""
+
+
+class SearchEnglish(SearchLanguage):
+ lang = 'en'
+ js_stemmer_code = js_porter_stemmer
+ stopwords = english_stopwords
+
+ def init(self, options):
+ if CSTEMMER:
+ class Stemmer(CStemmer):
+ def stem(self, word):
+ return self(word.lower())
+ else:
+ class Stemmer(PorterStemmer):
+ """All those porter stemmer implementations look hideous;
+ make at least the stem method nicer.
+ """
+ def stem(self, word):
+ word = word.lower()
+ return PorterStemmer.stem(self, word, 0, len(word) - 1)
+
+ self.stemmer = Stemmer()
+
+ def stem(self, word):
+ return self.stemmer.stem(word)
diff --git a/sphinx/search/ja.py b/sphinx/search/ja.py
new file mode 100644
index 00000000..0a7d83a1
--- /dev/null
+++ b/sphinx/search/ja.py
@@ -0,0 +1,273 @@
+# -*- coding: utf-8 -*-
+"""
+ sphinx.search.ja
+ ~~~~~~~~~~~~~~~~
+
+ Japanese search language: includes routine to split words.
+
+ :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
+ :license: BSD, see LICENSE for details.
+"""
+
+# Python Version of TinySegmenter
+# (http://chasen.org/~taku/software/TinySegmenter/)
+# TinySegmenter is super compact Japanese tokenizer.
+#
+# TinySegmenter was originally developed by Taku Kudo <taku(at)chasen.org>.
+# Python Version was developed by xnights <programming.magic(at)gmail.com>.
+# For details, see http://programming-magic.com/?id=170
+
+import os
+import re
+import sys
+
+try:
+ import MeCab
+ native_module = True
+except ImportError:
+ native_module = False
+
+from sphinx.search import SearchLanguage
+
+
+class MecabBinder(object):
+ def __init__(self, options):
+ self.ctypes_libmecab = None
+ self.ctypes_mecab = None
+ if not native_module:
+ self.init_ctypes(options)
+ else:
+ self.init_native(options)
+ self.dict_encode = options.get('dic_enc', 'utf-8')
+
+ def split(self, input):
+ input2 = input.encode(self.dict_encode)
+ if native_module:
+ result = self.native.parse(input2)
+ else:
+ result = self.ctypes_libmecab.mecab_sparse_tostr(
+ self.ctypes_mecab, input)
+ return result.decode(self.dict_encode).split(' ')
+
+ def init_native(self, options):
+ param = '-Owakati'
+ dict = options.get('dict')
+ if dict:
+ param += ' -d %s' % dict
+ self.native = MeCab.Tagger(param)
+
+ def init_ctypes(self, options):
+ import ctypes.util
+
+ lib = options.get('lib')
+
+ if lib is None:
+ if sys.platform.startswith('win'):
+ libname = 'libmecab.dll'
+ else:
+ libname = 'mecab'
+ libpath = ctypes.util.find_library(libname)
+ elif os.path.basename(lib) == lib:
+ libpath = ctypes.util.find_library(lib)
+ else:
+ libpath = None
+ if os.path.exists(lib):
+ libpath = lib
+ if libpath is None:
+ raise RuntimeError('MeCab dynamic library is not available')
+
+ param = 'mecab -Owakati'
+ dict = options.get('dict')
+ if dict:
+ param += ' -d %s' % dict
+
+ self.ctypes_libmecab = ctypes.CDLL(libpath)
+ self.ctypes_libmecab.mecab_sparse_tostr.restype = ctypes.c_char_p
+ self.ctypes_mecab = self.libmecab.mecab_new2(param)
+
+ def __del__(self):
+ if self.ctypes_libmecab:
+ self.ctypes_libmecab.mecab_destroy(self.ctypes_mecab)
+
+
+class TinySegmenter(object):
+ patterns_ = dict([(re.compile(pattern), value) for pattern, value in {
+ u'[一二三四五六七八九十百千万億兆]': u'M',
+ u'[一-龠々〆ヵヶ]': u'H',
+ u'[ぁ-ん]': u'I',
+ u'[ァ-ヴーア-ン゙ー]': u'K',
+ u'[a-zA-Za-zA-Z]': u'A',
+ u'[0-90-9]': u'N',
+ }.iteritems()])
+ BIAS__ = -332
+ BC1__ = {u'HH':6,u'II':2461,u'KH':406,u'OH':-1378}
+ BC2__ = {u'AA':-3267,u'AI':2744,u'AN':-878,u'HH':-4070,u'HM':-1711,u'HN':4012,u'HO':3761,u'IA':1327,u'IH':-1184,u'II':-1332,u'IK':1721,u'IO':5492,u'KI':3831,u'KK':-8741,u'MH':-3132,u'MK':3334,u'OO':-2920}
+ BC3__ = {u'HH':996,u'HI':626,u'HK':-721,u'HN':-1307,u'HO':-836,u'IH':-301,u'KK':2762,u'MK':1079,u'MM':4034,u'OA':-1652,u'OH':266}
+ BP1__ = {u'BB':295,u'OB':304,u'OO':-125,u'UB':352}
+ BP2__ = {u'BO':60,u'OO':-1762}
+ BQ1__ = {u'BHH':1150,u'BHM':1521,u'BII':-1158,u'BIM':886,u'BMH':1208,u'BNH':449,u'BOH':-91,u'BOO':-2597,u'OHI':451,u'OIH':-296,u'OKA':1851,u'OKH':-1020,u'OKK':904,u'OOO':2965}
+ BQ2__ = {u'BHH':118,u'BHI':-1159,u'BHM':466,u'BIH':-919,u'BKK':-1720,u'BKO':864,u'OHH':-1139,u'OHM':-181,u'OIH':153,u'UHI':-1146}
+ BQ3__ = {u'BHH':-792,u'BHI':2664,u'BII':-299,u'BKI':419,u'BMH':937,u'BMM':8335,u'BNN':998,u'BOH':775,u'OHH':2174,u'OHM':439,u'OII':280,u'OKH':1798,u'OKI':-793,u'OKO':-2242,u'OMH':-2402,u'OOO':11699}
+ BQ4__ = {u'BHH':-3895,u'BIH':3761,u'BII':-4654,u'BIK':1348,u'BKK':-1806,u'BMI':-3385,u'BOO':-12396,u'OAH':926,u'OHH':266,u'OHK':-2036,u'ONN':-973}
+ BW1__ = {u',と':660,u',同':727,u'B1あ':1404,u'B1同':542,u'、と':660,u'、同':727,u'」と':1682,u'あっ':1505,u'いう':1743,u'いっ':-2055,u'いる':672,u'うし':-4817,u'うん':665,u'から':3472,u'がら':600,u'こう':-790,u'こと':2083,u'こん':-1262,u'さら':-4143,u'さん':4573,u'した':2641,u'して':1104,u'すで':-3399,u'そこ':1977,u'それ':-871,u'たち':1122,u'ため':601,u'った':3463,u'つい':-802,u'てい':805,u'てき':1249,u'でき':1127,u'です':3445,u'では':844,u'とい':-4915,u'とみ':1922,u'どこ':3887,u'ない':5713,u'なっ':3015,u'など':7379,u'なん':-1113,u'にし':2468,u'には':1498,u'にも':1671,u'に対':-912,u'の一':-501,u'の中':741,u'ませ':2448,u'まで':1711,u'まま':2600,u'まる':-2155,u'やむ':-1947,u'よっ':-2565,u'れた':2369,u'れで':-913,u'をし':1860,u'を見':731,u'亡く':-1886,u'京都':2558,u'取り':-2784,u'大き':-2604,u'大阪':1497,u'平方':-2314,u'引き':-1336,u'日本':-195,u'本当':-2423,u'毎日':-2113,u'目指':-724,u'B1あ':1404,u'B1同':542,u'」と':1682}
+ BW2__ = {u'..':-11822,u'11':-669,u'――':-5730,u'−−':-13175,u'いう':-1609,u'うか':2490,u'かし':-1350,u'かも':-602,u'から':-7194,u'かれ':4612,u'がい':853,u'がら':-3198,u'きた':1941,u'くな':-1597,u'こと':-8392,u'この':-4193,u'させ':4533,u'され':13168,u'さん':-3977,u'しい':-1819,u'しか':-545,u'した':5078,u'して':972,u'しな':939,u'その':-3744,u'たい':-1253,u'たた':-662,u'ただ':-3857,u'たち':-786,u'たと':1224,u'たは':-939,u'った':4589,u'って':1647,u'っと':-2094,u'てい':6144,u'てき':3640,u'てく':2551,u'ては':-3110,u'ても':-3065,u'でい':2666,u'でき':-1528,u'でし':-3828,u'です':-4761,u'でも':-4203,u'とい':1890,u'とこ':-1746,u'とと':-2279,u'との':720,u'とみ':5168,u'とも':-3941,u'ない':-2488,u'なが':-1313,u'など':-6509,u'なの':2614,u'なん':3099,u'にお':-1615,u'にし':2748,u'にな':2454,u'によ':-7236,u'に対':-14943,u'に従':-4688,u'に関':-11388,u'のか':2093,u'ので':-7059,u'のに':-6041,u'のの':-6125,u'はい':1073,u'はが':-1033,u'はず':-2532,u'ばれ':1813,u'まし':-1316,u'まで':-6621,u'まれ':5409,u'めて':-3153,u'もい':2230,u'もの':-10713,u'らか':-944,u'らし':-1611,u'らに':-1897,u'りし':651,u'りま':1620,u'れた':4270,u'れて':849,u'れば':4114,u'ろう':6067,u'われ':7901,u'を通':-11877,u'んだ':728,u'んな':-4115,u'一人':602,u'一方':-1375,u'一日':970,u'一部':-1051,u'上が':-4479,u'会社':-1116,u'出て':2163,u'分の':-7758,u'同党':970,u'同日':-913,u'大阪':-2471,u'委員':-1250,u'少な':-1050,u'年度':-8669,u'年間':-1626,u'府県':-2363,u'手権':-1982,u'新聞':-4066,u'日新':-722,u'日本':-7068,u'日米':3372,u'曜日':-601,u'朝鮮':-2355,u'本人':-2697,u'東京':-1543,u'然と':-1384,u'社会':-1276,u'立て':-990,u'第に':-1612,u'米国':-4268,u'11':-669}
+ BW3__ = {u'あた':-2194,u'あり':719,u'ある':3846,u'い.':-1185,u'い。':-1185,u'いい':5308,u'いえ':2079,u'いく':3029,u'いた':2056,u'いっ':1883,u'いる':5600,u'いわ':1527,u'うち':1117,u'うと':4798,u'えと':1454,u'か.':2857,u'か。':2857,u'かけ':-743,u'かっ':-4098,u'かに':-669,u'から':6520,u'かり':-2670,u'が,':1816,u'が、':1816,u'がき':-4855,u'がけ':-1127,u'がっ':-913,u'がら':-4977,u'がり':-2064,u'きた':1645,u'けど':1374,u'こと':7397,u'この':1542,u'ころ':-2757,u'さい':-714,u'さを':976,u'し,':1557,u'し、':1557,u'しい':-3714,u'した':3562,u'して':1449,u'しな':2608,u'しま':1200,u'す.':-1310,u'す。':-1310,u'する':6521,u'ず,':3426,u'ず、':3426,u'ずに':841,u'そう':428,u'た.':8875,u'た。':8875,u'たい':-594,u'たの':812,u'たり':-1183,u'たる':-853,u'だ.':4098,u'だ。':4098,u'だっ':1004,u'った':-4748,u'って':300,u'てい':6240,u'てお':855,u'ても':302,u'です':1437,u'でに':-1482,u'では':2295,u'とう':-1387,u'とし':2266,u'との':541,u'とも':-3543,u'どう':4664,u'ない':1796,u'なく':-903,u'など':2135,u'に,':-1021,u'に、':-1021,u'にし':1771,u'にな':1906,u'には':2644,u'の,':-724,u'の、':-724,u'の子':-1000,u'は,':1337,u'は、':1337,u'べき':2181,u'まし':1113,u'ます':6943,u'まっ':-1549,u'まで':6154,u'まれ':-793,u'らし':1479,u'られ':6820,u'るる':3818,u'れ,':854,u'れ、':854,u'れた':1850,u'れて':1375,u'れば':-3246,u'れる':1091,u'われ':-605,u'んだ':606,u'んで':798,u'カ月':990,u'会議':860,u'入り':1232,u'大会':2217,u'始め':1681,u'市':965,u'新聞':-5055,u'日,':974,u'日、':974,u'社会':2024,u'カ月':990}
+ TC1__ = {u'AAA':1093,u'HHH':1029,u'HHM':580,u'HII':998,u'HOH':-390,u'HOM':-331,u'IHI':1169,u'IOH':-142,u'IOI':-1015,u'IOM':467,u'MMH':187,u'OOI':-1832}
+ TC2__ = {u'HHO':2088,u'HII':-1023,u'HMM':-1154,u'IHI':-1965,u'KKH':703,u'OII':-2649}
+ TC3__ = {u'AAA':-294,u'HHH':346,u'HHI':-341,u'HII':-1088,u'HIK':731,u'HOH':-1486,u'IHH':128,u'IHI':-3041,u'IHO':-1935,u'IIH':-825,u'IIM':-1035,u'IOI':-542,u'KHH':-1216,u'KKA':491,u'KKH':-1217,u'KOK':-1009,u'MHH':-2694,u'MHM':-457,u'MHO':123,u'MMH':-471,u'NNH':-1689,u'NNO':662,u'OHO':-3393}
+ TC4__ = {u'HHH':-203,u'HHI':1344,u'HHK':365,u'HHM':-122,u'HHN':182,u'HHO':669,u'HIH':804,u'HII':679,u'HOH':446,u'IHH':695,u'IHO':-2324,u'IIH':321,u'III':1497,u'IIO':656,u'IOO':54,u'KAK':4845,u'KKA':3386,u'KKK':3065,u'MHH':-405,u'MHI':201,u'MMH':-241,u'MMM':661,u'MOM':841}
+ TQ1__ = {u'BHHH':-227,u'BHHI':316,u'BHIH':-132,u'BIHH':60,u'BIII':1595,u'BNHH':-744,u'BOHH':225,u'BOOO':-908,u'OAKK':482,u'OHHH':281,u'OHIH':249,u'OIHI':200,u'OIIH':-68}
+ TQ2__ = {u'BIHH':-1401,u'BIII':-1033,u'BKAK':-543,u'BOOO':-5591}
+ TQ3__ = {u'BHHH':478,u'BHHM':-1073,u'BHIH':222,u'BHII':-504,u'BIIH':-116,u'BIII':-105,u'BMHI':-863,u'BMHM':-464,u'BOMH':620,u'OHHH':346,u'OHHI':1729,u'OHII':997,u'OHMH':481,u'OIHH':623,u'OIIH':1344,u'OKAK':2792,u'OKHH':587,u'OKKA':679,u'OOHH':110,u'OOII':-685}
+ TQ4__ = {u'BHHH':-721,u'BHHM':-3604,u'BHII':-966,u'BIIH':-607,u'BIII':-2181,u'OAAA':-2763,u'OAKK':180,u'OHHH':-294,u'OHHI':2446,u'OHHO':480,u'OHIH':-1573,u'OIHH':1935,u'OIHI':-493,u'OIIH':626,u'OIII':-4007,u'OKAK':-8156}
+ TW1__ = {u'につい':-4681,u'東京都':2026}
+ TW2__ = {u'ある程':-2049,u'いった':-1256,u'ころが':-2434,u'しょう':3873,u'その後':-4430,u'だって':-1049,u'ていた':1833,u'として':-4657,u'ともに':-4517,u'もので':1882,u'一気に':-792,u'初めて':-1512,u'同時に':-8097,u'大きな':-1255,u'対して':-2721,u'社会党':-3216}
+ TW3__ = {u'いただ':-1734,u'してい':1314,u'として':-4314,u'につい':-5483,u'にとっ':-5989,u'に当た':-6247,u'ので,':-727,u'ので、':-727,u'のもの':-600,u'れから':-3752,u'十二月':-2287}
+ TW4__ = {u'いう.':8576,u'いう。':8576,u'からな':-2348,u'してい':2958,u'たが,':1516,u'たが、':1516,u'ている':1538,u'という':1349,u'ました':5543,u'ません':1097,u'ようと':-4258,u'よると':5865}
+ UC1__ = {u'A':484,u'K':93,u'M':645,u'O':-505}
+ UC2__ = {u'A':819,u'H':1059,u'I':409,u'M':3987,u'N':5775,u'O':646}
+ UC3__ = {u'A':-1370,u'I':2311}
+ UC4__ = {u'A':-2643,u'H':1809,u'I':-1032,u'K':-3450,u'M':3565,u'N':3876,u'O':6646}
+ UC5__ = {u'H':313,u'I':-1238,u'K':-799,u'M':539,u'O':-831}
+ UC6__ = {u'H':-506,u'I':-253,u'K':87,u'M':247,u'O':-387}
+ UP1__ = {u'O':-214}
+ UP2__ = {u'B':69,u'O':935}
+ UP3__ = {u'B':189}
+ UQ1__ = {u'BH':21,u'BI':-12,u'BK':-99,u'BN':142,u'BO':-56,u'OH':-95,u'OI':477,u'OK':410,u'OO':-2422}
+ UQ2__ = {u'BH':216,u'BI':113,u'OK':1759}
+ UQ3__ = {u'BA':-479,u'BH':42,u'BI':1913,u'BK':-7198,u'BM':3160,u'BN':6427,u'BO':14761,u'OI':-827,u'ON':-3212}
+ UW1__ = {u',':156,u'、':156,u'「':-463,u'あ':-941,u'う':-127,u'が':-553,u'き':121,u'こ':505,u'で':-201,u'と':-547,u'ど':-123,u'に':-789,u'の':-185,u'は':-847,u'も':-466,u'や':-470,u'よ':182,u'ら':-292,u'り':208,u'れ':169,u'を':-446,u'ん':-137,u'・':-135,u'主':-402,u'京':-268,u'区':-912,u'午':871,u'国':-460,u'大':561,u'委':729,u'市':-411,u'日':-141,u'理':361,u'生':-408,u'県':-386,u'都':-718,u'「':-463,u'・':-135}
+ UW2__ = {u',':-829,u'、':-829,u'〇':892,u'「':-645,u'」':3145,u'あ':-538,u'い':505,u'う':134,u'お':-502,u'か':1454,u'が':-856,u'く':-412,u'こ':1141,u'さ':878,u'ざ':540,u'し':1529,u'す':-675,u'せ':300,u'そ':-1011,u'た':188,u'だ':1837,u'つ':-949,u'て':-291,u'で':-268,u'と':-981,u'ど':1273,u'な':1063,u'に':-1764,u'の':130,u'は':-409,u'ひ':-1273,u'べ':1261,u'ま':600,u'も':-1263,u'や':-402,u'よ':1639,u'り':-579,u'る':-694,u'れ':571,u'を':-2516,u'ん':2095,u'ア':-587,u'カ':306,u'キ':568,u'ッ':831,u'三':-758,u'不':-2150,u'世':-302,u'中':-968,u'主':-861,u'事':492,u'人':-123,u'会':978,u'保':362,u'入':548,u'初':-3025,u'副':-1566,u'北':-3414,u'区':-422,u'大':-1769,u'天':-865,u'太':-483,u'子':-1519,u'学':760,u'実':1023,u'小':-2009,u'市':-813,u'年':-1060,u'強':1067,u'手':-1519,u'揺':-1033,u'政':1522,u'文':-1355,u'新':-1682,u'日':-1815,u'明':-1462,u'最':-630,u'朝':-1843,u'本':-1650,u'東':-931,u'果':-665,u'次':-2378,u'民':-180,u'気':-1740,u'理':752,u'発':529,u'目':-1584,u'相':-242,u'県':-1165,u'立':-763,u'第':810,u'米':509,u'自':-1353,u'行':838,u'西':-744,u'見':-3874,u'調':1010,u'議':1198,u'込':3041,u'開':1758,u'間':-1257,u'「':-645,u'」':3145,u'ッ':831,u'ア':-587,u'カ':306,u'キ':568}
+ UW3__ = {u',':4889,u'1':-800,u'−':-1723,u'、':4889,u'々':-2311,u'〇':5827,u'」':2670,u'〓':-3573,u'あ':-2696,u'い':1006,u'う':2342,u'え':1983,u'お':-4864,u'か':-1163,u'が':3271,u'く':1004,u'け':388,u'げ':401,u'こ':-3552,u'ご':-3116,u'さ':-1058,u'し':-395,u'す':584,u'せ':3685,u'そ':-5228,u'た':842,u'ち':-521,u'っ':-1444,u'つ':-1081,u'て':6167,u'で':2318,u'と':1691,u'ど':-899,u'な':-2788,u'に':2745,u'の':4056,u'は':4555,u'ひ':-2171,u'ふ':-1798,u'へ':1199,u'ほ':-5516,u'ま':-4384,u'み':-120,u'め':1205,u'も':2323,u'や':-788,u'よ':-202,u'ら':727,u'り':649,u'る':5905,u'れ':2773,u'わ':-1207,u'を':6620,u'ん':-518,u'ア':551,u'グ':1319,u'ス':874,u'ッ':-1350,u'ト':521,u'ム':1109,u'ル':1591,u'ロ':2201,u'ン':278,u'・':-3794,u'一':-1619,u'下':-1759,u'世':-2087,u'両':3815,u'中':653,u'主':-758,u'予':-1193,u'二':974,u'人':2742,u'今':792,u'他':1889,u'以':-1368,u'低':811,u'何':4265,u'作':-361,u'保':-2439,u'元':4858,u'党':3593,u'全':1574,u'公':-3030,u'六':755,u'共':-1880,u'円':5807,u'再':3095,u'分':457,u'初':2475,u'別':1129,u'前':2286,u'副':4437,u'力':365,u'動':-949,u'務':-1872,u'化':1327,u'北':-1038,u'区':4646,u'千':-2309,u'午':-783,u'協':-1006,u'口':483,u'右':1233,u'各':3588,u'合':-241,u'同':3906,u'和':-837,u'員':4513,u'国':642,u'型':1389,u'場':1219,u'外':-241,u'妻':2016,u'学':-1356,u'安':-423,u'実':-1008,u'家':1078,u'小':-513,u'少':-3102,u'州':1155,u'市':3197,u'平':-1804,u'年':2416,u'広':-1030,u'府':1605,u'度':1452,u'建':-2352,u'当':-3885,u'得':1905,u'思':-1291,u'性':1822,u'戸':-488,u'指':-3973,u'政':-2013,u'教':-1479,u'数':3222,u'文':-1489,u'新':1764,u'日':2099,u'旧':5792,u'昨':-661,u'時':-1248,u'曜':-951,u'最':-937,u'月':4125,u'期':360,u'李':3094,u'村':364,u'東':-805,u'核':5156,u'森':2438,u'業':484,u'氏':2613,u'民':-1694,u'決':-1073,u'法':1868,u'海':-495,u'無':979,u'物':461,u'特':-3850,u'生':-273,u'用':914,u'町':1215,u'的':7313,u'直':-1835,u'省':792,u'県':6293,u'知':-1528,u'私':4231,u'税':401,u'立':-960,u'第':1201,u'米':7767,u'系':3066,u'約':3663,u'級':1384,u'統':-4229,u'総':1163,u'線':1255,u'者':6457,u'能':725,u'自':-2869,u'英':785,u'見':1044,u'調':-562,u'財':-733,u'費':1777,u'車':1835,u'軍':1375,u'込':-1504,u'通':-1136,u'選':-681,u'郎':1026,u'郡':4404,u'部':1200,u'金':2163,u'長':421,u'開':-1432,u'間':1302,u'関':-1282,u'雨':2009,u'電':-1045,u'非':2066,u'駅':1620,u'1':-800,u'」':2670,u'・':-3794,u'ッ':-1350,u'ア':551,u'グ':1319,u'ス':874,u'ト':521,u'ム':1109,u'ル':1591,u'ロ':2201,u'ン':278}
+ UW4__ = {u',':3930,u'.':3508,u'―':-4841,u'、':3930,u'。':3508,u'〇':4999,u'「':1895,u'」':3798,u'〓':-5156,u'あ':4752,u'い':-3435,u'う':-640,u'え':-2514,u'お':2405,u'か':530,u'が':6006,u'き':-4482,u'ぎ':-3821,u'く':-3788,u'け':-4376,u'げ':-4734,u'こ':2255,u'ご':1979,u'さ':2864,u'し':-843,u'じ':-2506,u'す':-731,u'ず':1251,u'せ':181,u'そ':4091,u'た':5034,u'だ':5408,u'ち':-3654,u'っ':-5882,u'つ':-1659,u'て':3994,u'で':7410,u'と':4547,u'な':5433,u'に':6499,u'ぬ':1853,u'ね':1413,u'の':7396,u'は':8578,u'ば':1940,u'ひ':4249,u'び':-4134,u'ふ':1345,u'へ':6665,u'べ':-744,u'ほ':1464,u'ま':1051,u'み':-2082,u'む':-882,u'め':-5046,u'も':4169,u'ゃ':-2666,u'や':2795,u'ょ':-1544,u'よ':3351,u'ら':-2922,u'り':-9726,u'る':-14896,u'れ':-2613,u'ろ':-4570,u'わ':-1783,u'を':13150,u'ん':-2352,u'カ':2145,u'コ':1789,u'セ':1287,u'ッ':-724,u'ト':-403,u'メ':-1635,u'ラ':-881,u'リ':-541,u'ル':-856,u'ン':-3637,u'・':-4371,u'ー':-11870,u'一':-2069,u'中':2210,u'予':782,u'事':-190,u'井':-1768,u'人':1036,u'以':544,u'会':950,u'体':-1286,u'作':530,u'側':4292,u'先':601,u'党':-2006,u'共':-1212,u'内':584,u'円':788,u'初':1347,u'前':1623,u'副':3879,u'力':-302,u'動':-740,u'務':-2715,u'化':776,u'区':4517,u'協':1013,u'参':1555,u'合':-1834,u'和':-681,u'員':-910,u'器':-851,u'回':1500,u'国':-619,u'園':-1200,u'地':866,u'場':-1410,u'塁':-2094,u'士':-1413,u'多':1067,u'大':571,u'子':-4802,u'学':-1397,u'定':-1057,u'寺':-809,u'小':1910,u'屋':-1328,u'山':-1500,u'島':-2056,u'川':-2667,u'市':2771,u'年':374,u'庁':-4556,u'後':456,u'性':553,u'感':916,u'所':-1566,u'支':856,u'改':787,u'政':2182,u'教':704,u'文':522,u'方':-856,u'日':1798,u'時':1829,u'最':845,u'月':-9066,u'木':-485,u'来':-442,u'校':-360,u'業':-1043,u'氏':5388,u'民':-2716,u'気':-910,u'沢':-939,u'済':-543,u'物':-735,u'率':672,u'球':-1267,u'生':-1286,u'産':-1101,u'田':-2900,u'町':1826,u'的':2586,u'目':922,u'省':-3485,u'県':2997,u'空':-867,u'立':-2112,u'第':788,u'米':2937,u'系':786,u'約':2171,u'経':1146,u'統':-1169,u'総':940,u'線':-994,u'署':749,u'者':2145,u'能':-730,u'般':-852,u'行':-792,u'規':792,u'警':-1184,u'議':-244,u'谷':-1000,u'賞':730,u'車':-1481,u'軍':1158,u'輪':-1433,u'込':-3370,u'近':929,u'道':-1291,u'選':2596,u'郎':-4866,u'都':1192,u'野':-1100,u'銀':-2213,u'長':357,u'間':-2344,u'院':-2297,u'際':-2604,u'電':-878,u'領':-1659,u'題':-792,u'館':-1984,u'首':1749,u'高':2120,u'「':1895,u'」':3798,u'・':-4371,u'ッ':-724,u'ー':-11870,u'カ':2145,u'コ':1789,u'セ':1287,u'ト':-403,u'メ':-1635,u'ラ':-881,u'リ':-541,u'ル':-856,u'ン':-3637}
+ UW5__ = {u',':465,u'.':-299,u'1':-514,u'E2':-32768,u']':-2762,u'、':465,u'。':-299,u'「':363,u'あ':1655,u'い':331,u'う':-503,u'え':1199,u'お':527,u'か':647,u'が':-421,u'き':1624,u'ぎ':1971,u'く':312,u'げ':-983,u'さ':-1537,u'し':-1371,u'す':-852,u'だ':-1186,u'ち':1093,u'っ':52,u'つ':921,u'て':-18,u'で':-850,u'と':-127,u'ど':1682,u'な':-787,u'に':-1224,u'の':-635,u'は':-578,u'べ':1001,u'み':502,u'め':865,u'ゃ':3350,u'ょ':854,u'り':-208,u'る':429,u'れ':504,u'わ':419,u'を':-1264,u'ん':327,u'イ':241,u'ル':451,u'ン':-343,u'中':-871,u'京':722,u'会':-1153,u'党':-654,u'務':3519,u'区':-901,u'告':848,u'員':2104,u'大':-1296,u'学':-548,u'定':1785,u'嵐':-1304,u'市':-2991,u'席':921,u'年':1763,u'思':872,u'所':-814,u'挙':1618,u'新':-1682,u'日':218,u'月':-4353,u'査':932,u'格':1356,u'機':-1508,u'氏':-1347,u'田':240,u'町':-3912,u'的':-3149,u'相':1319,u'省':-1052,u'県':-4003,u'研':-997,u'社':-278,u'空':-813,u'統':1955,u'者':-2233,u'表':663,u'語':-1073,u'議':1219,u'選':-1018,u'郎':-368,u'長':786,u'間':1191,u'題':2368,u'館':-689,u'1':-514,u'E2':-32768,u'「':363,u'イ':241,u'ル':451,u'ン':-343}
+ UW6__ = {u',':227,u'.':808,u'1':-270,u'E1':306,u'、':227,u'。':808,u'あ':-307,u'う':189,u'か':241,u'が':-73,u'く':-121,u'こ':-200,u'じ':1782,u'す':383,u'た':-428,u'っ':573,u'て':-1014,u'で':101,u'と':-105,u'な':-253,u'に':-149,u'の':-417,u'は':-236,u'も':-206,u'り':187,u'る':-135,u'を':195,u'ル':-673,u'ン':-496,u'一':-277,u'中':201,u'件':-800,u'会':624,u'前':302,u'区':1792,u'員':-1212,u'委':798,u'学':-960,u'市':887,u'広':-695,u'後':535,u'業':-697,u'相':753,u'社':-507,u'福':974,u'空':-822,u'者':1811,u'連':463,u'郎':1082,u'1':-270,u'E1':306,u'ル':-673,u'ン':-496}
+
+ # ctype_
+ def ctype_(self, char):
+ for pattern, value in self.patterns_.iteritems():
+ if pattern.match(char):
+ return value
+ return u'O'
+ # ts_
+ def ts_(self, dict, key):
+ if key in dict:
+ return dict[key]
+ return 0
+
+ # segment
+ def split(self, input):
+ if not input:
+ return []
+
+ result = []
+ seg = [u'B3',u'B2',u'B1']
+ ctype = [u'O',u'O',u'O']
+ for t in input:
+ seg.append(t)
+ ctype.append(self.ctype_(t))
+ seg.append(u'E1')
+ seg.append(u'E2')
+ seg.append(u'E3')
+ ctype.append(u'O')
+ ctype.append(u'O')
+ ctype.append(u'O')
+ word = seg[3]
+ p1 = u'U'
+ p2 = u'U'
+ p3 = u'U'
+
+ for i in range(4, len(seg) - 3):
+ score = self.BIAS__
+ w1 = seg[i-3]
+ w2 = seg[i-2]
+ w3 = seg[i-1]
+ w4 = seg[i]
+ w5 = seg[i+1]
+ w6 = seg[i+2]
+ c1 = ctype[i-3]
+ c2 = ctype[i-2]
+ c3 = ctype[i-1]
+ c4 = ctype[i]
+ c5 = ctype[i+1]
+ c6 = ctype[i+2]
+ score += self.ts_(self.UP1__, p1)
+ score += self.ts_(self.UP2__, p2)
+ score += self.ts_(self.UP3__, p3)
+ score += self.ts_(self.BP1__, p1 + p2)
+ score += self.ts_(self.BP2__, p2 + p3)
+ score += self.ts_(self.UW1__, w1)
+ score += self.ts_(self.UW2__, w2)
+ score += self.ts_(self.UW3__, w3)
+ score += self.ts_(self.UW4__, w4)
+ score += self.ts_(self.UW5__, w5)
+ score += self.ts_(self.UW6__, w6)
+ score += self.ts_(self.BW1__, w2 + w3)
+ score += self.ts_(self.BW2__, w3 + w4)
+ score += self.ts_(self.BW3__, w4 + w5)
+ score += self.ts_(self.TW1__, w1 + w2 + w3)
+ score += self.ts_(self.TW2__, w2 + w3 + w4)
+ score += self.ts_(self.TW3__, w3 + w4 + w5)
+ score += self.ts_(self.TW4__, w4 + w5 + w6)
+ score += self.ts_(self.UC1__, c1)
+ score += self.ts_(self.UC2__, c2)
+ score += self.ts_(self.UC3__, c3)
+ score += self.ts_(self.UC4__, c4)
+ score += self.ts_(self.UC5__, c5)
+ score += self.ts_(self.UC6__, c6)
+ score += self.ts_(self.BC1__, c2 + c3)
+ score += self.ts_(self.BC2__, c3 + c4)
+ score += self.ts_(self.BC3__, c4 + c5)
+ score += self.ts_(self.TC1__, c1 + c2 + c3)
+ score += self.ts_(self.TC2__, c2 + c3 + c4)
+ score += self.ts_(self.TC3__, c3 + c4 + c5)
+ score += self.ts_(self.TC4__, c4 + c5 + c6)
+# score += self.ts_(self.TC5__, c4 + c5 + c6)
+ score += self.ts_(self.UQ1__, p1 + c1)
+ score += self.ts_(self.UQ2__, p2 + c2)
+ score += self.ts_(self.UQ1__, p3 + c3)
+ score += self.ts_(self.BQ1__, p2 + c2 + c3)
+ score += self.ts_(self.BQ2__, p2 + c3 + c4)
+ score += self.ts_(self.BQ3__, p3 + c2 + c3)
+ score += self.ts_(self.BQ4__, p3 + c3 + c4)
+ score += self.ts_(self.TQ1__, p2 + c1 + c2 + c3)
+ score += self.ts_(self.TQ2__, p2 + c2 + c3 + c4)
+ score += self.ts_(self.TQ3__, p3 + c1 + c2 + c3)
+ score += self.ts_(self.TQ4__, p3 + c2 + c3 + c4)
+ p = u'O'
+ if score > 0:
+ result.append(word)
+ word = u''
+ p = u'B'
+ p1 = p2
+ p2 = p3
+ p3 = p
+ word += seg[i]
+
+ result.append(word)
+ return result
+
+
+class SearchJapanese(SearchLanguage):
+ """
+ Japanese search implementation: uses no stemmer, but word splitting is quite
+ complicated.
+ """
+ lang = 'ja'
+
+ def init(self, options):
+ type = options.get('type', 'default')
+ if type not in ('mecab', 'default'):
+ raise ValueError(("Japanese tokenizer's type should be 'mecab'"
+ " or 'default'"))
+ self.libmecab = None
+ if type == 'mecab':
+ self.splitter = MecabBinder(options)
+ else:
+ self.splitter = TinySegmenter()
+
+ def split(self, input):
+ return self.splitter.split(input)
+
+ def word_filter(self, stemmed_word):
+ return len(stemmed_word) > 1
diff --git a/sphinx/setup_command.py b/sphinx/setup_command.py
index 34da039b..ebbcf27b 100644
--- a/sphinx/setup_command.py
+++ b/sphinx/setup_command.py
@@ -22,7 +22,8 @@ from sphinx.util.console import darkred, nocolor, color_terminal
class BuildDoc(Command):
- """Distutils command to build Sphinx documentation.
+ """
+ Distutils command to build Sphinx documentation.
The Sphinx build can then be triggered from distutils, and some Sphinx
options can be set in ``setup.py`` or ``setup.cfg`` instead of Sphinx own
diff --git a/sphinx/texinputs/sphinx.sty b/sphinx/texinputs/sphinx.sty
index 9b3ee43e..84c1ca1e 100644
--- a/sphinx/texinputs/sphinx.sty
+++ b/sphinx/texinputs/sphinx.sty
@@ -128,7 +128,6 @@
\newcommand{\strong}[1]{{\bf #1}}
\newcommand{\code}[1]{\texttt{#1}}
\newcommand{\bfcode}[1]{\code{\bfseries#1}}
-\newcommand{\samp}[1]{`\code{#1}'}
\newcommand{\email}[1]{\textsf{#1}}
% Redefine the Verbatim environment to allow border and background colors.
@@ -175,23 +174,6 @@
}
-% Index-entry generation support.
-%
-
-% Command to generate two index entries (using subentries)
-\newcommand{\indexii}[2]{\index{#1!#2}\index{#2!#1}}
-
-% And three entries (using only one level of subentries)
-\newcommand{\indexiii}[3]{\index{#1!#2 #3}\index{#2!#3, #1}\index{#3!#1 #2}}
-
-% And four (again, using only one level of subentries)
-\newcommand{\indexiv}[4]{
-\index{#1!#2 #3 #4}
-\index{#2!#3 #4, #1}
-\index{#3!#4, #1 #2}
-\index{#4!#1 #2 #3}
-}
-
% \moduleauthor{name}{email}
\newcommand{\moduleauthor}[2]{}
diff --git a/sphinx/themes/agogo/layout.html b/sphinx/themes/agogo/layout.html
index 3c427ed1..d063194a 100644
--- a/sphinx/themes/agogo/layout.html
+++ b/sphinx/themes/agogo/layout.html
@@ -19,7 +19,8 @@
</a></p>
{%- endif %}
{%- block headertitle %}
- <h1><a href="{{ pathto(master_doc) }}">{{ shorttitle|e }}</a></h1>
+ <div class="headertitle"><a
+ href="{{ pathto(master_doc) }}">{{ shorttitle|e }}</a></div>
{%- endblock %}
<div class="rel">
{%- for rellink in rellinks|reverse %}
diff --git a/sphinx/themes/agogo/static/agogo.css_t b/sphinx/themes/agogo/static/agogo.css_t
index 91ad44ef..b069bd22 100644
--- a/sphinx/themes/agogo/static/agogo.css_t
+++ b/sphinx/themes/agogo/static/agogo.css_t
@@ -128,14 +128,15 @@ div.header {
padding-bottom: 10px;
}
-div.header h1 {
+div.header .headertitle {
font-family: {{ theme_headerfont }};
font-weight: normal;
font-size: 180%;
letter-spacing: .08em;
+ margin-bottom: .8em;
}
-div.header h1 a {
+div.header .headertitle a {
color: white;
}
diff --git a/sphinx/themes/basic/genindex-single.html b/sphinx/themes/basic/genindex-single.html
index 0f2cad23..eff8c1ce 100644
--- a/sphinx/themes/basic/genindex-single.html
+++ b/sphinx/themes/basic/genindex-single.html
@@ -7,31 +7,48 @@
:copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
:license: BSD, see LICENSE for details.
#}
+{% macro indexentries(firstname, links) %}
+ <dt>
+ {%- if links -%}
+ <a href="{{ links[0][1] }}">
+ {%- if links[0][0] %}<strong>{% endif -%}
+ {{ firstname|e }}
+ {%- if links[0][0] %}</strong>{% endif -%}
+ </a>
+
+ {%- for ismain, link in links[1:] -%}
+ , <a href="{{ link }}">{% if ismain %}<strong>{% endif -%}
+ [{{ loop.index }}]
+ {%- if ismain %}</strong>{% endif -%}
+ </a>
+ {%- endfor %}
+ {%- else %}
+ {{ firstname|e }}
+ {%- endif %}
+ </dt>
+{% endmacro %}
+
{% extends "layout.html" %}
{% set title = _('Index') %}
{% block body %}
- <h1 id="index">{% trans key=key %}Index &ndash; {{ key }}{% endtrans %}</h1>
+<h1 id="index">{% trans key=key %}Index &ndash; {{ key }}{% endtrans %}</h1>
<table style="width: 100%" class="indextable"><tr>
{%- for column in entries|slice(2) if column %}
<td style="width: 33%" valign="top"><dl>
- {%- for entryname, (links, subitems) in column %}
- <dt>{% if links %}<a href="{{ links[0] }}">{{ entryname|e }}</a>
- {%- for link in links[1:] %}, <a href="{{ link }}">[{{ loop.index }}]</a>{% endfor %}
- {%- else %}{{ entryname|e }}{% endif %}</dt>
- {%- if subitems %}
- <dd><dl>
- {%- for subentryname, subentrylinks in subitems %}
- <dt><a href="{{ subentrylinks[0] }}">{{ subentryname|e }}</a>
- {%- for link in subentrylinks[1:] %}, <a href="{{ link }}">[{{ loop.index }}]</a>{% endfor -%}
- </dt>
+ {%- for entryname, (links, subitems) in column %}
+ {{ indexentries(entryname, links) }}
+ {%- if subitems %}
+ <dd><dl>
+ {%- for subentryname, subentrylinks in subitems %}
+ {{ indexentries(subentryname, subentrylinks) }}
+ {%- endfor %}
+ </dl></dd>
+ {%- endif -%}
{%- endfor %}
- </dl></dd>
- {%- endif -%}
-{%- endfor %}
-</dl></td>
-{%- endfor %}
+ </dl></td>
+ {%- endfor %}
</tr></table>
{% endblock %}
diff --git a/sphinx/themes/basic/genindex.html b/sphinx/themes/basic/genindex.html
index 182bbf8e..7bc002b6 100644
--- a/sphinx/themes/basic/genindex.html
+++ b/sphinx/themes/basic/genindex.html
@@ -7,39 +7,57 @@
:copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
:license: BSD, see LICENSE for details.
#}
+{% macro indexentries(firstname, links) %}
+ <dt>
+ {%- if links -%}
+ <a href="{{ links[0][1] }}">
+ {%- if links[0][0] %}<strong>{% endif -%}
+ {{ firstname|e }}
+ {%- if links[0][0] %}</strong>{% endif -%}
+ </a>
+
+ {%- for ismain, link in links[1:] -%}
+ , <a href="{{ link }}">{% if ismain %}<strong>{% endif -%}
+ [{{ loop.index }}]
+ {%- if ismain %}</strong>{% endif -%}
+ </a>
+ {%- endfor %}
+ {%- else %}
+ {{ firstname|e }}
+ {%- endif %}
+ </dt>
+{% endmacro %}
+
{% extends "layout.html" %}
{% set title = _('Index') %}
{% block body %}
- <h1 id="index">{{ _('Index') }}</h1>
+<h1 id="index">{{ _('Index') }}</h1>
- <div class="genindex-jumpbox">
- {% for key, dummy in genindexentries -%}
- <a href="#{{ key }}"><strong>{{ key }}</strong></a> {% if not loop.last %}| {% endif %}
- {%- endfor %}
- </div>
+<div class="genindex-jumpbox">
+ {% for key, dummy in genindexentries -%}
+ <a href="#{{ key }}"><strong>{{ key }}</strong></a>
+ {% if not loop.last %}| {% endif %}
+ {%- endfor %}
+</div>
- {%- for key, entries in genindexentries %}
+{%- for key, entries in genindexentries %}
<h2 id="{{ key }}">{{ key }}</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
{%- for column in entries|slice(2) if column %}
<td style="width: 33%" valign="top"><dl>
- {%- for entryname, (links, subitems) in column %}
- <dt>{% if links %}<a href="{{ links[0] }}">{{ entryname|e }}</a>
- {%- for link in links[1:] %}, <a href="{{ link }}">[{{ loop.index }}]</a>{% endfor %}
- {%- else %}{{ entryname|e }}{% endif %}</dt>
- {%- if subitems %}
- <dd><dl>
- {%- for subentryname, subentrylinks in subitems %}
- <dt><a href="{{ subentrylinks[0] }}">{{ subentryname|e }}</a>
- {%- for link in subentrylinks[1:] %}, <a href="{{ link }}">[{{ loop.index }}]</a>{% endfor -%}
- </dt>
+ {%- for entryname, (links, subitems) in column %}
+ {{ indexentries(entryname, links) }}
+ {%- if subitems %}
+ <dd><dl>
+ {%- for subentryname, subentrylinks in subitems %}
+ {{ indexentries(subentryname, subentrylinks) }}
+ {%- endfor %}
+ </dl></dd>
+ {%- endif -%}
{%- endfor %}
- </dl></dd>
- {%- endif -%}
-{%- endfor %}
-</dl></td>
-{%- endfor %}
+ </dl></td>
+ {%- endfor %}
</tr></table>
{% endfor %}
diff --git a/sphinx/themes/basic/layout.html b/sphinx/themes/basic/layout.html
index 7aa03155..9fb989cb 100644
--- a/sphinx/themes/basic/layout.html
+++ b/sphinx/themes/basic/layout.html
@@ -16,7 +16,13 @@
{%- set render_sidebar = (not embedded) and (not theme_nosidebar|tobool) and
(sidebars != []) %}
{%- set url_root = pathto('', 1) %}
+{# XXX necessary? #}
{%- if url_root == '#' %}{% set url_root = '' %}{% endif %}
+{%- if not embedded and docstitle %}
+ {%- set titlesuffix = " &mdash; "|safe + docstitle|e %}
+{%- else %}
+ {%- set titlesuffix = "" %}
+{%- endif %}
{%- macro relbar() %}
<div class="related">
@@ -78,24 +84,7 @@
{%- endif %}
{%- endmacro %}
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset={{ encoding }}" />
- {{ metatags }}
- {%- if not embedded and docstitle %}
- {%- set titlesuffix = " &mdash; "|safe + docstitle|e %}
- {%- else %}
- {%- set titlesuffix = "" %}
- {%- endif %}
- {%- block htmltitle %}
- <title>{{ title|striptags|e }}{{ titlesuffix }}</title>
- {%- endblock %}
- <link rel="stylesheet" href="{{ pathto('_static/' + style, 1) }}" type="text/css" />
- <link rel="stylesheet" href="{{ pathto('_static/pygments.css', 1) }}" type="text/css" />
- {%- for cssfile in css_files %}
- <link rel="stylesheet" href="{{ pathto(cssfile, 1) }}" type="text/css" />
- {%- endfor %}
- {%- if not embedded %}
+{%- macro script() %}
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '{{ url_root }}',
@@ -108,6 +97,26 @@
{%- for scriptfile in script_files %}
<script type="text/javascript" src="{{ pathto(scriptfile, 1) }}"></script>
{%- endfor %}
+{%- endmacro %}
+
+{%- macro css() %}
+ <link rel="stylesheet" href="{{ pathto('_static/' + style, 1) }}" type="text/css" />
+ <link rel="stylesheet" href="{{ pathto('_static/pygments.css', 1) }}" type="text/css" />
+ {%- for cssfile in css_files %}
+ <link rel="stylesheet" href="{{ pathto(cssfile, 1) }}" type="text/css" />
+ {%- endfor %}
+{%- endmacro %}
+
+<html xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+ <meta http-equiv="Content-Type" content="text/html; charset={{ encoding }}" />
+ {{ metatags }}
+ {%- block htmltitle %}
+ <title>{{ title|striptags|e }}{{ titlesuffix }}</title>
+ {%- endblock %}
+ {{ css() }}
+ {%- if not embedded %}
+ {{ script() }}
{%- if use_opensearch %}
<link rel="search" type="application/opensearchdescription+xml"
title="{% trans docstitle=docstitle|e %}Search within {{ docstitle }}{% endtrans %}"
diff --git a/sphinx/themes/basic/searchresults.html b/sphinx/themes/basic/searchresults.html
new file mode 100644
index 00000000..667abffd
--- /dev/null
+++ b/sphinx/themes/basic/searchresults.html
@@ -0,0 +1,36 @@
+{#
+ basic/searchresults.html
+ ~~~~~~~~~~~~~~~~~~~~~~~~
+
+ Template for the body of the search results page.
+
+ :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
+ :license: BSD, see LICENSE for details.
+#}
+<h1 id="search-documentation">Search</h1>
+<p>
+ From here you can search these documents. Enter your search
+ words into the box below and click "search".
+</p>
+<form action="" method="get">
+ <input type="text" name="q" value="" />
+ <input type="submit" value="search" />
+ <span id="search-progress" style="padding-left: 10px"></span>
+</form>
+{%- if search_performed %}
+ <h2>Search Results</h2>
+ {%- if not search_results %}
+ <p>Your search did not match any results.</p>
+ {%- endif %}
+{%- endif %}
+<div id="search-results">
+ {%- if search_results %}
+ <ul class="search">
+ {% for href, caption, context in search_results %}
+ <li><a href="{{ docroot }}{{ href }}/?highlight={{ q }}">{{ caption }}</a>
+ <div class="context">{{ context|e }}</div>
+ </li>
+ {% endfor %}
+ </ul>
+ {%- endif %}
+</div>
diff --git a/sphinx/themes/basic/static/ajax-loader.gif b/sphinx/themes/basic/static/ajax-loader.gif
new file mode 100644
index 00000000..61faf8ca
--- /dev/null
+++ b/sphinx/themes/basic/static/ajax-loader.gif
Binary files differ
diff --git a/sphinx/themes/basic/static/basic.css b/sphinx/themes/basic/static/basic.css_t
index eb22a942..9459201e 100644
--- a/sphinx/themes/basic/static/basic.css
+++ b/sphinx/themes/basic/static/basic.css_t
@@ -49,7 +49,7 @@ div.sphinxsidebarwrapper {
div.sphinxsidebar {
float: left;
- width: 230px;
+ width: {{ theme_sidebarwidth|toint }}px;
margin-left: -100%;
font-size: 90%;
}
@@ -447,6 +447,11 @@ dl.glossary dt {
font-style: oblique;
}
+abbr, acronym {
+ border-bottom: dotted 1px;
+ cursor: help;
+}
+
/* -- code displays --------------------------------------------------------- */
pre {
diff --git a/sphinx/themes/basic/static/comment-bright.png b/sphinx/themes/basic/static/comment-bright.png
new file mode 100644
index 00000000..551517b8
--- /dev/null
+++ b/sphinx/themes/basic/static/comment-bright.png
Binary files differ
diff --git a/sphinx/themes/basic/static/comment-close.png b/sphinx/themes/basic/static/comment-close.png
new file mode 100644
index 00000000..09b54be4
--- /dev/null
+++ b/sphinx/themes/basic/static/comment-close.png
Binary files differ
diff --git a/sphinx/themes/basic/static/comment.png b/sphinx/themes/basic/static/comment.png
new file mode 100644
index 00000000..92feb52b
--- /dev/null
+++ b/sphinx/themes/basic/static/comment.png
Binary files differ
diff --git a/sphinx/themes/basic/static/doctools.js b/sphinx/themes/basic/static/doctools.js
index 81869f10..bd1b44ef 100644
--- a/sphinx/themes/basic/static/doctools.js
+++ b/sphinx/themes/basic/static/doctools.js
@@ -185,9 +185,9 @@ var Documentation = {
body.highlightText(this.toLowerCase(), 'highlighted');
});
}, 10);
- $('<li class="highlight-link"><a href="javascript:Documentation.' +
- 'hideSearchWords()">' + _('Hide Search Matches') + '</a></li>')
- .appendTo($('.sphinxsidebar .this-page-menu'));
+ $('<p class="highlight-link"><a href="javascript:Documentation.' +
+ 'hideSearchWords()">' + _('Hide Search Matches') + '</a></p>')
+ .appendTo($('#searchbox'));
}
},
@@ -213,7 +213,7 @@ var Documentation = {
* helper function to hide the search marks again
*/
hideSearchWords : function() {
- $('.sphinxsidebar .this-page-menu li.highlight-link').fadeOut(300);
+ $('#searchbox .highlight-link').fadeOut(300);
$('span.highlighted').removeClass('highlighted');
},
diff --git a/sphinx/themes/basic/static/down-pressed.png b/sphinx/themes/basic/static/down-pressed.png
new file mode 100644
index 00000000..6f7ad782
--- /dev/null
+++ b/sphinx/themes/basic/static/down-pressed.png
Binary files differ
diff --git a/sphinx/themes/basic/static/down.png b/sphinx/themes/basic/static/down.png
new file mode 100644
index 00000000..3003a887
--- /dev/null
+++ b/sphinx/themes/basic/static/down.png
Binary files differ
diff --git a/sphinx/themes/basic/static/searchtools.js b/sphinx/themes/basic/static/searchtools.js_t
index 4a78f913..45989c6a 100644
--- a/sphinx/themes/basic/static/searchtools.js
+++ b/sphinx/themes/basic/static/searchtools.js_t
@@ -1,6 +1,6 @@
/*
- * searchtools.js
- * ~~~~~~~~~~~~~~
+ * searchtools.js_t
+ * ~~~~~~~~~~~~~~~~
*
* Sphinx JavaScript utilties for the full-text search.
*
@@ -36,188 +36,7 @@ jQuery.makeSearchSummary = function(text, keywords, hlwords) {
return rv;
}
-/**
- * Porter Stemmer
- */
-var PorterStemmer = function() {
-
- var step2list = {
- ational: 'ate',
- tional: 'tion',
- enci: 'ence',
- anci: 'ance',
- izer: 'ize',
- bli: 'ble',
- alli: 'al',
- entli: 'ent',
- eli: 'e',
- ousli: 'ous',
- ization: 'ize',
- ation: 'ate',
- ator: 'ate',
- alism: 'al',
- iveness: 'ive',
- fulness: 'ful',
- ousness: 'ous',
- aliti: 'al',
- iviti: 'ive',
- biliti: 'ble',
- logi: 'log'
- };
-
- var step3list = {
- icate: 'ic',
- ative: '',
- alize: 'al',
- iciti: 'ic',
- ical: 'ic',
- ful: '',
- ness: ''
- };
-
- var c = "[^aeiou]"; // consonant
- var v = "[aeiouy]"; // vowel
- var C = c + "[^aeiouy]*"; // consonant sequence
- var V = v + "[aeiou]*"; // vowel sequence
-
- var mgr0 = "^(" + C + ")?" + V + C; // [C]VC... is m>0
- var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1
- var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1
- var s_v = "^(" + C + ")?" + v; // vowel in stem
-
- this.stemWord = function (w) {
- var stem;
- var suffix;
- var firstch;
- var origword = w;
-
- if (w.length < 3)
- return w;
-
- var re;
- var re2;
- var re3;
- var re4;
-
- firstch = w.substr(0,1);
- if (firstch == "y")
- w = firstch.toUpperCase() + w.substr(1);
-
- // Step 1a
- re = /^(.+?)(ss|i)es$/;
- re2 = /^(.+?)([^s])s$/;
-
- if (re.test(w))
- w = w.replace(re,"$1$2");
- else if (re2.test(w))
- w = w.replace(re2,"$1$2");
-
- // Step 1b
- re = /^(.+?)eed$/;
- re2 = /^(.+?)(ed|ing)$/;
- if (re.test(w)) {
- var fp = re.exec(w);
- re = new RegExp(mgr0);
- if (re.test(fp[1])) {
- re = /.$/;
- w = w.replace(re,"");
- }
- }
- else if (re2.test(w)) {
- var fp = re2.exec(w);
- stem = fp[1];
- re2 = new RegExp(s_v);
- if (re2.test(stem)) {
- w = stem;
- re2 = /(at|bl|iz)$/;
- re3 = new RegExp("([^aeiouylsz])\\1$");
- re4 = new RegExp("^" + C + v + "[^aeiouwxy]$");
- if (re2.test(w))
- w = w + "e";
- else if (re3.test(w)) {
- re = /.$/;
- w = w.replace(re,"");
- }
- else if (re4.test(w))
- w = w + "e";
- }
- }
-
- // Step 1c
- re = /^(.+?)y$/;
- if (re.test(w)) {
- var fp = re.exec(w);
- stem = fp[1];
- re = new RegExp(s_v);
- if (re.test(stem))
- w = stem + "i";
- }
-
- // Step 2
- re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/;
- if (re.test(w)) {
- var fp = re.exec(w);
- stem = fp[1];
- suffix = fp[2];
- re = new RegExp(mgr0);
- if (re.test(stem))
- w = stem + step2list[suffix];
- }
-
- // Step 3
- re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/;
- if (re.test(w)) {
- var fp = re.exec(w);
- stem = fp[1];
- suffix = fp[2];
- re = new RegExp(mgr0);
- if (re.test(stem))
- w = stem + step3list[suffix];
- }
-
- // Step 4
- re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/;
- re2 = /^(.+?)(s|t)(ion)$/;
- if (re.test(w)) {
- var fp = re.exec(w);
- stem = fp[1];
- re = new RegExp(mgr1);
- if (re.test(stem))
- w = stem;
- }
- else if (re2.test(w)) {
- var fp = re2.exec(w);
- stem = fp[1] + fp[2];
- re2 = new RegExp(mgr1);
- if (re2.test(stem))
- w = stem;
- }
-
- // Step 5
- re = /^(.+?)e$/;
- if (re.test(w)) {
- var fp = re.exec(w);
- stem = fp[1];
- re = new RegExp(mgr1);
- re2 = new RegExp(meq1);
- re3 = new RegExp("^" + C + v + "[^aeiouwxy]$");
- if (re.test(stem) || (re2.test(stem) && !(re3.test(stem))))
- w = stem;
- }
- re = /ll$/;
- re2 = new RegExp(mgr1);
- if (re.test(w) && re2.test(w)) {
- re = /.$/;
- w = w.replace(re,"");
- }
-
- // and turn initial Y back to y
- if (firstch == "y")
- w = firstch.toLowerCase() + w.substr(1);
- return w;
- }
-}
-
+{{ search_language_stemming_code|safe }}
/**
* Search Module
@@ -300,20 +119,20 @@ var Search = {
},
query : function(query) {
- var stopwords = ['and', 'then', 'into', 'it', 'as', 'are', 'in',
- 'if', 'for', 'no', 'there', 'their', 'was', 'is',
- 'be', 'to', 'that', 'but', 'they', 'not', 'such',
- 'with', 'by', 'a', 'on', 'these', 'of', 'will',
- 'this', 'near', 'the', 'or', 'at'];
-
- // stem the searchterms and add them to the correct list
- var stemmer = new PorterStemmer();
+ var stopwords = {{ search_language_stop_words }};
+
+ // Stem the searchterms and add them to the correct list
+ var stemmer = new Stemmer();
var searchterms = [];
var excluded = [];
var hlterms = [];
var tmp = query.split(/\s+/);
- var object = (tmp.length == 1) ? tmp[0].toLowerCase() : null;
+ var objectterms = [];
for (var i = 0; i < tmp.length; i++) {
+ if (tmp[i] != "") {
+ objectterms.push(tmp[i].toLowerCase());
+ }
+
if ($u.indexOf(stopwords, tmp[i]) != -1 || tmp[i].match(/^\d+$/) ||
tmp[i] == "") {
// skip this "word"
@@ -344,9 +163,6 @@ var Search = {
var filenames = this._index.filenames;
var titles = this._index.titles;
var terms = this._index.terms;
- var objects = this._index.objects;
- var objtypes = this._index.objtypes;
- var objnames = this._index.objnames;
var fileMap = {};
var files = null;
// different result priorities
@@ -357,43 +173,19 @@ var Search = {
$('#search-progress').empty();
// lookup as object
- if (object != null) {
- for (var prefix in objects) {
- for (var name in objects[prefix]) {
- var fullname = (prefix ? prefix + '.' : '') + name;
- if (fullname.toLowerCase().indexOf(object) > -1) {
- match = objects[prefix][name];
- descr = objnames[match[1]][2] + _(', in ') + titles[match[0]];
- anchor = match[3];
- if (anchor == '')
- anchor = fullname;
- else if (anchor == '-')
- anchor = objnames[match[1]][1] + '-' + fullname;
- result = [filenames[match[0]], fullname, '#'+anchor, descr];
- switch (match[2]) {
- case 1: objectResults.push(result); break;
- case 0: importantResults.push(result); break;
- case 2: unimportantResults.push(result); break;
- }
- }
- }
- }
+ for (var i = 0; i < objectterms.length; i++) {
+ var others = [].concat(objectterms.slice(0,i),
+ objectterms.slice(i+1, objectterms.length))
+ var results = this.performObjectSearch(objectterms[i], others);
+ // Assume first word is most likely to be the object,
+ // other words more likely to be in description.
+ // Therefore put matches for earlier words first.
+ // (Results are eventually used in reverse order).
+ objectResults = results[0].concat(objectResults);
+ importantResults = results[1].concat(importantResults);
+ unimportantResults = results[2].concat(unimportantResults);
}
- // sort results descending
- objectResults.sort(function(a, b) {
- return (a[1] > b[1]) ? -1 : ((a[1] < b[1]) ? 1 : 0);
- });
-
- importantResults.sort(function(a, b) {
- return (a[1] > b[1]) ? -1 : ((a[1] < b[1]) ? 1 : 0);
- });
-
- unimportantResults.sort(function(a, b) {
- return (a[1] > b[1]) ? -1 : ((a[1] < b[1]) ? 1 : 0);
- });
-
-
// perform the search on the required terms
for (var i = 0; i < searchterms.length; i++) {
var word = searchterms[i];
@@ -513,6 +305,71 @@ var Search = {
}
}
displayNextItem();
+ },
+
+ performObjectSearch : function(object, otherterms) {
+ var filenames = this._index.filenames;
+ var objects = this._index.objects;
+ var objnames = this._index.objnames;
+ var titles = this._index.titles;
+
+ var importantResults = [];
+ var objectResults = [];
+ var unimportantResults = [];
+
+ for (var prefix in objects) {
+ for (var name in objects[prefix]) {
+ var fullname = (prefix ? prefix + '.' : '') + name;
+ if (fullname.toLowerCase().indexOf(object) > -1) {
+ var match = objects[prefix][name];
+ var objname = objnames[match[1]][2];
+ var title = titles[match[0]];
+ // If more than one term searched for, we require other words to be
+ // found in the name/title/description
+ if (otherterms.length > 0) {
+ var haystack = (prefix + ' ' + name + ' ' +
+ objname + ' ' + title).toLowerCase();
+ var allfound = true;
+ for (var i = 0; i < otherterms.length; i++) {
+ if (haystack.indexOf(otherterms[i]) == -1) {
+ allfound = false;
+ break;
+ }
+ }
+ if (!allfound) {
+ continue;
+ }
+ }
+ var descr = objname + _(', in ') + title;
+ anchor = match[3];
+ if (anchor == '')
+ anchor = fullname;
+ else if (anchor == '-')
+ anchor = objnames[match[1]][1] + '-' + fullname;
+ result = [filenames[match[0]], fullname, '#'+anchor, descr];
+ switch (match[2]) {
+ case 1: objectResults.push(result); break;
+ case 0: importantResults.push(result); break;
+ case 2: unimportantResults.push(result); break;
+ }
+ }
+ }
+ }
+
+ // sort results descending
+ objectResults.sort(function(a, b) {
+ return (a[1] > b[1]) ? -1 : ((a[1] < b[1]) ? 1 : 0);
+ });
+
+ importantResults.sort(function(a, b) {
+ return (a[1] > b[1]) ? -1 : ((a[1] < b[1]) ? 1 : 0);
+ });
+
+ unimportantResults.sort(function(a, b) {
+ return (a[1] > b[1]) ? -1 : ((a[1] < b[1]) ? 1 : 0);
+ });
+
+ return [importantResults, objectResults, unimportantResults]
}
}
diff --git a/sphinx/themes/basic/static/underscore.js b/sphinx/themes/basic/static/underscore.js
index 9146e086..5d899143 100644
--- a/sphinx/themes/basic/static/underscore.js
+++ b/sphinx/themes/basic/static/underscore.js
@@ -1,3 +1,10 @@
+// Underscore.js 0.5.5
+// (c) 2009 Jeremy Ashkenas, DocumentCloud Inc.
+// Underscore is freely distributable under the terms of the MIT license.
+// Portions of Underscore are inspired by or borrowed from Prototype.js,
+// Oliver Steele's Functional, and John Resig's Micro-Templating.
+// For all details and documentation:
+// http://documentcloud.github.com/underscore/
(function(){var j=this,n=j._,i=function(a){this._wrapped=a},m=typeof StopIteration!=="undefined"?StopIteration:"__break__",b=j._=function(a){return new i(a)};if(typeof exports!=="undefined")exports._=b;var k=Array.prototype.slice,o=Array.prototype.unshift,p=Object.prototype.toString,q=Object.prototype.hasOwnProperty,r=Object.prototype.propertyIsEnumerable;b.VERSION="0.5.5";b.each=function(a,c,d){try{if(a.forEach)a.forEach(c,d);else if(b.isArray(a)||b.isArguments(a))for(var e=0,f=a.length;e<f;e++)c.call(d,
a[e],e,a);else{var g=b.keys(a);f=g.length;for(e=0;e<f;e++)c.call(d,a[g[e]],g[e],a)}}catch(h){if(h!=m)throw h;}return a};b.map=function(a,c,d){if(a&&b.isFunction(a.map))return a.map(c,d);var e=[];b.each(a,function(f,g,h){e.push(c.call(d,f,g,h))});return e};b.reduce=function(a,c,d,e){if(a&&b.isFunction(a.reduce))return a.reduce(b.bind(d,e),c);b.each(a,function(f,g,h){c=d.call(e,c,f,g,h)});return c};b.reduceRight=function(a,c,d,e){if(a&&b.isFunction(a.reduceRight))return a.reduceRight(b.bind(d,e),c);
var f=b.clone(b.toArray(a)).reverse();b.each(f,function(g,h){c=d.call(e,c,g,h,a)});return c};b.detect=function(a,c,d){var e;b.each(a,function(f,g,h){if(c.call(d,f,g,h)){e=f;b.breakLoop()}});return e};b.select=function(a,c,d){if(a&&b.isFunction(a.filter))return a.filter(c,d);var e=[];b.each(a,function(f,g,h){c.call(d,f,g,h)&&e.push(f)});return e};b.reject=function(a,c,d){var e=[];b.each(a,function(f,g,h){!c.call(d,f,g,h)&&e.push(f)});return e};b.all=function(a,c,d){c=c||b.identity;if(a&&b.isFunction(a.every))return a.every(c,
diff --git a/sphinx/themes/basic/static/up-pressed.png b/sphinx/themes/basic/static/up-pressed.png
new file mode 100644
index 00000000..8bd587af
--- /dev/null
+++ b/sphinx/themes/basic/static/up-pressed.png
Binary files differ
diff --git a/sphinx/themes/basic/static/up.png b/sphinx/themes/basic/static/up.png
new file mode 100644
index 00000000..b9462568
--- /dev/null
+++ b/sphinx/themes/basic/static/up.png
Binary files differ
diff --git a/sphinx/themes/basic/static/websupport.js b/sphinx/themes/basic/static/websupport.js
new file mode 100644
index 00000000..e9bd1b85
--- /dev/null
+++ b/sphinx/themes/basic/static/websupport.js
@@ -0,0 +1,808 @@
+/*
+ * websupport.js
+ * ~~~~~~~~~~~~~
+ *
+ * sphinx.websupport utilties for all documentation.
+ *
+ * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
+ * :license: BSD, see LICENSE for details.
+ *
+ */
+
+(function($) {
+ $.fn.autogrow = function() {
+ return this.each(function() {
+ var textarea = this;
+
+ $.fn.autogrow.resize(textarea);
+
+ $(textarea)
+ .focus(function() {
+ textarea.interval = setInterval(function() {
+ $.fn.autogrow.resize(textarea);
+ }, 500);
+ })
+ .blur(function() {
+ clearInterval(textarea.interval);
+ });
+ });
+ };
+
+ $.fn.autogrow.resize = function(textarea) {
+ var lineHeight = parseInt($(textarea).css('line-height'), 10);
+ var lines = textarea.value.split('\n');
+ var columns = textarea.cols;
+ var lineCount = 0;
+ $.each(lines, function() {
+ lineCount += Math.ceil(this.length / columns) || 1;
+ });
+ var height = lineHeight * (lineCount + 1);
+ $(textarea).css('height', height);
+ };
+})(jQuery);
+
+(function($) {
+ var comp, by;
+
+ function init() {
+ initEvents();
+ initComparator();
+ }
+
+ function initEvents() {
+ $('a.comment-close').live("click", function(event) {
+ event.preventDefault();
+ hide($(this).attr('id').substring(2));
+ });
+ $('a.vote').live("click", function(event) {
+ event.preventDefault();
+ handleVote($(this));
+ });
+ $('a.reply').live("click", function(event) {
+ event.preventDefault();
+ openReply($(this).attr('id').substring(2));
+ });
+ $('a.close-reply').live("click", function(event) {
+ event.preventDefault();
+ closeReply($(this).attr('id').substring(2));
+ });
+ $('a.sort-option').live("click", function(event) {
+ event.preventDefault();
+ handleReSort($(this));
+ });
+ $('a.show-proposal').live("click", function(event) {
+ event.preventDefault();
+ showProposal($(this).attr('id').substring(2));
+ });
+ $('a.hide-proposal').live("click", function(event) {
+ event.preventDefault();
+ hideProposal($(this).attr('id').substring(2));
+ });
+ $('a.show-propose-change').live("click", function(event) {
+ event.preventDefault();
+ showProposeChange($(this).attr('id').substring(2));
+ });
+ $('a.hide-propose-change').live("click", function(event) {
+ event.preventDefault();
+ hideProposeChange($(this).attr('id').substring(2));
+ });
+ $('a.accept-comment').live("click", function(event) {
+ event.preventDefault();
+ acceptComment($(this).attr('id').substring(2));
+ });
+ $('a.delete-comment').live("click", function(event) {
+ event.preventDefault();
+ deleteComment($(this).attr('id').substring(2));
+ });
+ $('a.comment-markup').live("click", function(event) {
+ event.preventDefault();
+ toggleCommentMarkupBox($(this).attr('id').substring(2));
+ });
+ }
+
+ /**
+ * Set comp, which is a comparator function used for sorting and
+ * inserting comments into the list.
+ */
+ function setComparator() {
+ // If the first three letters are "asc", sort in ascending order
+ // and remove the prefix.
+ if (by.substring(0,3) == 'asc') {
+ var i = by.substring(3);
+ comp = function(a, b) { return a[i] - b[i]; };
+ } else {
+ // Otherwise sort in descending order.
+ comp = function(a, b) { return b[by] - a[by]; };
+ }
+
+ // Reset link styles and format the selected sort option.
+ $('a.sel').attr('href', '#').removeClass('sel');
+ $('a.by' + by).removeAttr('href').addClass('sel');
+ }
+
+ /**
+ * Create a comp function. If the user has preferences stored in
+ * the sortBy cookie, use those, otherwise use the default.
+ */
+ function initComparator() {
+ by = 'rating'; // Default to sort by rating.
+ // If the sortBy cookie is set, use that instead.
+ if (document.cookie.length > 0) {
+ var start = document.cookie.indexOf('sortBy=');
+ if (start != -1) {
+ start = start + 7;
+ var end = document.cookie.indexOf(";", start);
+ if (end == -1) {
+ end = document.cookie.length;
+ by = unescape(document.cookie.substring(start, end));
+ }
+ }
+ }
+ setComparator();
+ }
+
+ /**
+ * Show a comment div.
+ */
+ function show(id) {
+ $('#ao' + id).hide();
+ $('#ah' + id).show();
+ var context = $.extend({id: id}, opts);
+ var popup = $(renderTemplate(popupTemplate, context)).hide();
+ popup.find('textarea[name="proposal"]').hide();
+ popup.find('a.by' + by).addClass('sel');
+ var form = popup.find('#cf' + id);
+ form.submit(function(event) {
+ event.preventDefault();
+ addComment(form);
+ });
+ $('#s' + id).after(popup);
+ popup.slideDown('fast', function() {
+ getComments(id);
+ });
+ }
+
+ /**
+ * Hide a comment div.
+ */
+ function hide(id) {
+ $('#ah' + id).hide();
+ $('#ao' + id).show();
+ var div = $('#sc' + id);
+ div.slideUp('fast', function() {
+ div.remove();
+ });
+ }
+
+ /**
+ * Perform an ajax request to get comments for a node
+ * and insert the comments into the comments tree.
+ */
+ function getComments(id) {
+ $.ajax({
+ type: 'GET',
+ url: opts.getCommentsURL,
+ data: {node: id},
+ success: function(data, textStatus, request) {
+ var ul = $('#cl' + id);
+ var speed = 100;
+ $('#cf' + id)
+ .find('textarea[name="proposal"]')
+ .data('source', data.source);
+
+ if (data.comments.length === 0) {
+ ul.html('<li>No comments yet.</li>');
+ ul.data('empty', true);
+ } else {
+ // If there are comments, sort them and put them in the list.
+ var comments = sortComments(data.comments);
+ speed = data.comments.length * 100;
+ appendComments(comments, ul);
+ ul.data('empty', false);
+ }
+ $('#cn' + id).slideUp(speed + 200);
+ ul.slideDown(speed);
+ },
+ error: function(request, textStatus, error) {
+ showError('Oops, there was a problem retrieving the comments.');
+ },
+ dataType: 'json'
+ });
+ }
+
+ /**
+ * Add a comment via ajax and insert the comment into the comment tree.
+ */
+ function addComment(form) {
+ var node_id = form.find('input[name="node"]').val();
+ var parent_id = form.find('input[name="parent"]').val();
+ var text = form.find('textarea[name="comment"]').val();
+ var proposal = form.find('textarea[name="proposal"]').val();
+
+ if (text == '') {
+ showError('Please enter a comment.');
+ return;
+ }
+
+ // Disable the form that is being submitted.
+ form.find('textarea,input').attr('disabled', 'disabled');
+
+ // Send the comment to the server.
+ $.ajax({
+ type: "POST",
+ url: opts.addCommentURL,
+ dataType: 'json',
+ data: {
+ node: node_id,
+ parent: parent_id,
+ text: text,
+ proposal: proposal
+ },
+ success: function(data, textStatus, error) {
+ // Reset the form.
+ if (node_id) {
+ hideProposeChange(node_id);
+ }
+ form.find('textarea')
+ .val('')
+ .add(form.find('input'))
+ .removeAttr('disabled');
+ var ul = $('#cl' + (node_id || parent_id));
+ if (ul.data('empty')) {
+ $(ul).empty();
+ ul.data('empty', false);
+ }
+ insertComment(data.comment);
+ var ao = $('#ao' + node_id);
+ ao.find('img').attr({'src': opts.commentBrightImage});
+ if (node_id) {
+ // if this was a "root" comment, remove the commenting box
+ // (the user can get it back by reopening the comment popup)
+ $('#ca' + node_id).slideUp();
+ }
+ },
+ error: function(request, textStatus, error) {
+ form.find('textarea,input').removeAttr('disabled');
+ showError('Oops, there was a problem adding the comment.');
+ }
+ });
+ }
+
+ /**
+ * Recursively append comments to the main comment list and children
+ * lists, creating the comment tree.
+ */
+ function appendComments(comments, ul) {
+ $.each(comments, function() {
+ var div = createCommentDiv(this);
+ ul.append($(document.createElement('li')).html(div));
+ appendComments(this.children, div.find('ul.comment-children'));
+ // To avoid stagnating data, don't store the comments children in data.
+ this.children = null;
+ div.data('comment', this);
+ });
+ }
+
+ /**
+ * After adding a new comment, it must be inserted in the correct
+ * location in the comment tree.
+ */
+ function insertComment(comment) {
+ var div = createCommentDiv(comment);
+
+ // To avoid stagnating data, don't store the comments children in data.
+ comment.children = null;
+ div.data('comment', comment);
+
+ var ul = $('#cl' + (comment.node || comment.parent));
+ var siblings = getChildren(ul);
+
+ var li = $(document.createElement('li'));
+ li.hide();
+
+ // Determine where in the parents children list to insert this comment.
+ for(i=0; i < siblings.length; i++) {
+ if (comp(comment, siblings[i]) <= 0) {
+ $('#cd' + siblings[i].id)
+ .parent()
+ .before(li.html(div));
+ li.slideDown('fast');
+ return;
+ }
+ }
+
+ // If we get here, this comment rates lower than all the others,
+ // or it is the only comment in the list.
+ ul.append(li.html(div));
+ li.slideDown('fast');
+ }
+
+ function acceptComment(id) {
+ $.ajax({
+ type: 'POST',
+ url: opts.acceptCommentURL,
+ data: {id: id},
+ success: function(data, textStatus, request) {
+ $('#cm' + id).fadeOut('fast');
+ $('#cd' + id).removeClass('moderate');
+ },
+ error: function(request, textStatus, error) {
+ showError('Oops, there was a problem accepting the comment.');
+ }
+ });
+ }
+
+ function deleteComment(id) {
+ $.ajax({
+ type: 'POST',
+ url: opts.deleteCommentURL,
+ data: {id: id},
+ success: function(data, textStatus, request) {
+ var div = $('#cd' + id);
+ if (data == 'delete') {
+ // Moderator mode: remove the comment and all children immediately
+ div.slideUp('fast', function() {
+ div.remove();
+ });
+ return;
+ }
+ // User mode: only mark the comment as deleted
+ div
+ .find('span.user-id:first')
+ .text('[deleted]').end()
+ .find('div.comment-text:first')
+ .text('[deleted]').end()
+ .find('#cm' + id + ', #dc' + id + ', #ac' + id + ', #rc' + id +
+ ', #sp' + id + ', #hp' + id + ', #cr' + id + ', #rl' + id)
+ .remove();
+ var comment = div.data('comment');
+ comment.username = '[deleted]';
+ comment.text = '[deleted]';
+ div.data('comment', comment);
+ },
+ error: function(request, textStatus, error) {
+ showError('Oops, there was a problem deleting the comment.');
+ }
+ });
+ }
+
+ function showProposal(id) {
+ $('#sp' + id).hide();
+ $('#hp' + id).show();
+ $('#pr' + id).slideDown('fast');
+ }
+
+ function hideProposal(id) {
+ $('#hp' + id).hide();
+ $('#sp' + id).show();
+ $('#pr' + id).slideUp('fast');
+ }
+
+ function showProposeChange(id) {
+ $('#pc' + id).hide();
+ $('#hc' + id).show();
+ var textarea = $('#pt' + id);
+ textarea.val(textarea.data('source'));
+ $.fn.autogrow.resize(textarea[0]);
+ textarea.slideDown('fast');
+ }
+
+ function hideProposeChange(id) {
+ $('#hc' + id).hide();
+ $('#pc' + id).show();
+ var textarea = $('#pt' + id);
+ textarea.val('').removeAttr('disabled');
+ textarea.slideUp('fast');
+ }
+
+ function toggleCommentMarkupBox(id) {
+ $('#mb' + id).toggle();
+ }
+
+ /** Handle when the user clicks on a sort by link. */
+ function handleReSort(link) {
+ var classes = link.attr('class').split(/\s+/);
+ for (var i=0; i<classes.length; i++) {
+ if (classes[i] != 'sort-option') {
+ by = classes[i].substring(2);
+ }
+ }
+ setComparator();
+ // Save/update the sortBy cookie.
+ var expiration = new Date();
+ expiration.setDate(expiration.getDate() + 365);
+ document.cookie= 'sortBy=' + escape(by) +
+ ';expires=' + expiration.toUTCString();
+ $('ul.comment-ul').each(function(index, ul) {
+ var comments = getChildren($(ul), true);
+ comments = sortComments(comments);
+ appendComments(comments, $(ul).empty());
+ });
+ }
+
+ /**
+ * Function to process a vote when a user clicks an arrow.
+ */
+ function handleVote(link) {
+ if (!opts.voting) {
+ showError("You'll need to login to vote.");
+ return;
+ }
+
+ var id = link.attr('id');
+ if (!id) {
+ // Didn't click on one of the voting arrows.
+ return;
+ }
+ // If it is an unvote, the new vote value is 0,
+ // Otherwise it's 1 for an upvote, or -1 for a downvote.
+ var value = 0;
+ if (id.charAt(1) != 'u') {
+ value = id.charAt(0) == 'u' ? 1 : -1;
+ }
+ // The data to be sent to the server.
+ var d = {
+ comment_id: id.substring(2),
+ value: value
+ };
+
+ // Swap the vote and unvote links.
+ link.hide();
+ $('#' + id.charAt(0) + (id.charAt(1) == 'u' ? 'v' : 'u') + d.comment_id)
+ .show();
+
+ // The div the comment is displayed in.
+ var div = $('div#cd' + d.comment_id);
+ var data = div.data('comment');
+
+ // If this is not an unvote, and the other vote arrow has
+ // already been pressed, unpress it.
+ if ((d.value !== 0) && (data.vote === d.value * -1)) {
+ $('#' + (d.value == 1 ? 'd' : 'u') + 'u' + d.comment_id).hide();
+ $('#' + (d.value == 1 ? 'd' : 'u') + 'v' + d.comment_id).show();
+ }
+
+ // Update the comments rating in the local data.
+ data.rating += (data.vote === 0) ? d.value : (d.value - data.vote);
+ data.vote = d.value;
+ div.data('comment', data);
+
+ // Change the rating text.
+ div.find('.rating:first')
+ .text(data.rating + ' point' + (data.rating == 1 ? '' : 's'));
+
+ // Send the vote information to the server.
+ $.ajax({
+ type: "POST",
+ url: opts.processVoteURL,
+ data: d,
+ error: function(request, textStatus, error) {
+ showError('Oops, there was a problem casting that vote.');
+ }
+ });
+ }
+
+ /**
+ * Open a reply form used to reply to an existing comment.
+ */
+ function openReply(id) {
+ // Swap out the reply link for the hide link
+ $('#rl' + id).hide();
+ $('#cr' + id).show();
+
+ // Add the reply li to the children ul.
+ var div = $(renderTemplate(replyTemplate, {id: id})).hide();
+ $('#cl' + id)
+ .prepend(div)
+ // Setup the submit handler for the reply form.
+ .find('#rf' + id)
+ .submit(function(event) {
+ event.preventDefault();
+ addComment($('#rf' + id));
+ closeReply(id);
+ })
+ .find('input[type=button]')
+ .click(function() {
+ closeReply(id);
+ });
+ div.slideDown('fast', function() {
+ $('#rf' + id).find('textarea').focus();
+ });
+ }
+
+ /**
+ * Close the reply form opened with openReply.
+ */
+ function closeReply(id) {
+ // Remove the reply div from the DOM.
+ $('#rd' + id).slideUp('fast', function() {
+ $(this).remove();
+ });
+
+ // Swap out the hide link for the reply link
+ $('#cr' + id).hide();
+ $('#rl' + id).show();
+ }
+
+ /**
+ * Recursively sort a tree of comments using the comp comparator.
+ */
+ function sortComments(comments) {
+ comments.sort(comp);
+ $.each(comments, function() {
+ this.children = sortComments(this.children);
+ });
+ return comments;
+ }
+
+ /**
+ * Get the children comments from a ul. If recursive is true,
+ * recursively include childrens' children.
+ */
+ function getChildren(ul, recursive) {
+ var children = [];
+ ul.children().children("[id^='cd']")
+ .each(function() {
+ var comment = $(this).data('comment');
+ if (recursive)
+ comment.children = getChildren($(this).find('#cl' + comment.id), true);
+ children.push(comment);
+ });
+ return children;
+ }
+
+ /** Create a div to display a comment in. */
+ function createCommentDiv(comment) {
+ if (!comment.displayed && !opts.moderator) {
+ return $('<div class="moderate">Thank you! Your comment will show up '
+ + 'once it is has been approved by a moderator.</div>');
+ }
+ // Prettify the comment rating.
+ comment.pretty_rating = comment.rating + ' point' +
+ (comment.rating == 1 ? '' : 's');
+ // Make a class (for displaying not yet moderated comments differently)
+ comment.css_class = comment.displayed ? '' : ' moderate';
+ // Create a div for this comment.
+ var context = $.extend({}, opts, comment);
+ var div = $(renderTemplate(commentTemplate, context));
+
+ // If the user has voted on this comment, highlight the correct arrow.
+ if (comment.vote) {
+ var direction = (comment.vote == 1) ? 'u' : 'd';
+ div.find('#' + direction + 'v' + comment.id).hide();
+ div.find('#' + direction + 'u' + comment.id).show();
+ }
+
+ if (opts.moderator || comment.text != '[deleted]') {
+ div.find('a.reply').show();
+ if (comment.proposal_diff)
+ div.find('#sp' + comment.id).show();
+ if (opts.moderator && !comment.displayed)
+ div.find('#cm' + comment.id).show();
+ if (opts.moderator || (opts.username == comment.username))
+ div.find('#dc' + comment.id).show();
+ }
+ return div;
+ }
+
+ /**
+ * A simple template renderer. Placeholders such as <%id%> are replaced
+ * by context['id'] with items being escaped. Placeholders such as <#id#>
+ * are not escaped.
+ */
+ function renderTemplate(template, context) {
+ var esc = $(document.createElement('div'));
+
+ function handle(ph, escape) {
+ var cur = context;
+ $.each(ph.split('.'), function() {
+ cur = cur[this];
+ });
+ return escape ? esc.text(cur || "").html() : cur;
+ }
+
+ return template.replace(/<([%#])([\w\.]*)\1>/g, function() {
+ return handle(arguments[2], arguments[1] == '%' ? true : false);
+ });
+ }
+
+ /** Flash an error message briefly. */
+ function showError(message) {
+ $(document.createElement('div')).attr({'class': 'popup-error'})
+ .append($(document.createElement('div'))
+ .attr({'class': 'error-message'}).text(message))
+ .appendTo('body')
+ .fadeIn("slow")
+ .delay(2000)
+ .fadeOut("slow");
+ }
+
+ /** Add a link the user uses to open the comments popup. */
+ $.fn.comment = function() {
+ return this.each(function() {
+ var id = $(this).attr('id').substring(1);
+ var count = COMMENT_METADATA[id];
+ var title = count + ' comment' + (count == 1 ? '' : 's');
+ var image = count > 0 ? opts.commentBrightImage : opts.commentImage;
+ var addcls = count == 0 ? ' nocomment' : '';
+ $(this)
+ .append(
+ $(document.createElement('a')).attr({
+ href: '#',
+ 'class': 'sphinx-comment-open' + addcls,
+ id: 'ao' + id
+ })
+ .append($(document.createElement('img')).attr({
+ src: image,
+ alt: 'comment',
+ title: title
+ }))
+ .click(function(event) {
+ event.preventDefault();
+ show($(this).attr('id').substring(2));
+ })
+ )
+ .append(
+ $(document.createElement('a')).attr({
+ href: '#',
+ 'class': 'sphinx-comment-close hidden',
+ id: 'ah' + id
+ })
+ .append($(document.createElement('img')).attr({
+ src: opts.closeCommentImage,
+ alt: 'close',
+ title: 'close'
+ }))
+ .click(function(event) {
+ event.preventDefault();
+ hide($(this).attr('id').substring(2));
+ })
+ );
+ });
+ };
+
+ var opts = {
+ processVoteURL: '/_process_vote',
+ addCommentURL: '/_add_comment',
+ getCommentsURL: '/_get_comments',
+ acceptCommentURL: '/_accept_comment',
+ deleteCommentURL: '/_delete_comment',
+ commentImage: '/static/_static/comment.png',
+ closeCommentImage: '/static/_static/comment-close.png',
+ loadingImage: '/static/_static/ajax-loader.gif',
+ commentBrightImage: '/static/_static/comment-bright.png',
+ upArrow: '/static/_static/up.png',
+ downArrow: '/static/_static/down.png',
+ upArrowPressed: '/static/_static/up-pressed.png',
+ downArrowPressed: '/static/_static/down-pressed.png',
+ voting: false,
+ moderator: false
+ };
+
+ if (typeof COMMENT_OPTIONS != "undefined") {
+ opts = jQuery.extend(opts, COMMENT_OPTIONS);
+ }
+
+ var popupTemplate = '\
+ <div class="sphinx-comments" id="sc<%id%>">\
+ <p class="sort-options">\
+ Sort by:\
+ <a href="#" class="sort-option byrating">best rated</a>\
+ <a href="#" class="sort-option byascage">newest</a>\
+ <a href="#" class="sort-option byage">oldest</a>\
+ </p>\
+ <div class="comment-header">Comments</div>\
+ <div class="comment-loading" id="cn<%id%>">\
+ loading comments... <img src="<%loadingImage%>" alt="" /></div>\
+ <ul id="cl<%id%>" class="comment-ul"></ul>\
+ <div id="ca<%id%>">\
+ <p class="add-a-comment">Add a comment\
+ (<a href="#" class="comment-markup" id="ab<%id%>">markup</a>):</p>\
+ <div class="comment-markup-box" id="mb<%id%>">\
+ reStructured text markup: <i>*emph*</i>, <b>**strong**</b>, \
+ <tt>``code``</tt>, \
+ code blocks: <tt>::</tt> and an indented block after blank line</div>\
+ <form method="post" id="cf<%id%>" class="comment-form" action="">\
+ <textarea name="comment" cols="80"></textarea>\
+ <p class="propose-button">\
+ <a href="#" id="pc<%id%>" class="show-propose-change">\
+ Propose a change &#9657;\
+ </a>\
+ <a href="#" id="hc<%id%>" class="hide-propose-change">\
+ Propose a change &#9663;\
+ </a>\
+ </p>\
+ <textarea name="proposal" id="pt<%id%>" cols="80"\
+ spellcheck="false"></textarea>\
+ <input type="submit" value="Add comment" />\
+ <input type="hidden" name="node" value="<%id%>" />\
+ <input type="hidden" name="parent" value="" />\
+ </form>\
+ </div>\
+ </div>';
+
+ var commentTemplate = '\
+ <div id="cd<%id%>" class="sphinx-comment<%css_class%>">\
+ <div class="vote">\
+ <div class="arrow">\
+ <a href="#" id="uv<%id%>" class="vote" title="vote up">\
+ <img src="<%upArrow%>" />\
+ </a>\
+ <a href="#" id="uu<%id%>" class="un vote" title="vote up">\
+ <img src="<%upArrowPressed%>" />\
+ </a>\
+ </div>\
+ <div class="arrow">\
+ <a href="#" id="dv<%id%>" class="vote" title="vote down">\
+ <img src="<%downArrow%>" id="da<%id%>" />\
+ </a>\
+ <a href="#" id="du<%id%>" class="un vote" title="vote down">\
+ <img src="<%downArrowPressed%>" />\
+ </a>\
+ </div>\
+ </div>\
+ <div class="comment-content">\
+ <p class="tagline comment">\
+ <span class="user-id"><%username%></span>\
+ <span class="rating"><%pretty_rating%></span>\
+ <span class="delta"><%time.delta%></span>\
+ </p>\
+ <div class="comment-text comment"><#text#></div>\
+ <p class="comment-opts comment">\
+ <a href="#" class="reply hidden" id="rl<%id%>">reply &#9657;</a>\
+ <a href="#" class="close-reply" id="cr<%id%>">reply &#9663;</a>\
+ <a href="#" id="sp<%id%>" class="show-proposal">proposal &#9657;</a>\
+ <a href="#" id="hp<%id%>" class="hide-proposal">proposal &#9663;</a>\
+ <a href="#" id="dc<%id%>" class="delete-comment hidden">delete</a>\
+ <span id="cm<%id%>" class="moderation hidden">\
+ <a href="#" id="ac<%id%>" class="accept-comment">accept</a>\
+ </span>\
+ </p>\
+ <pre class="proposal" id="pr<%id%>">\
+<#proposal_diff#>\
+ </pre>\
+ <ul class="comment-children" id="cl<%id%>"></ul>\
+ </div>\
+ <div class="clearleft"></div>\
+ </div>\
+ </div>';
+
+ var replyTemplate = '\
+ <li>\
+ <div class="reply-div" id="rd<%id%>">\
+ <form id="rf<%id%>">\
+ <textarea name="comment" cols="80"></textarea>\
+ <input type="submit" value="Add reply" />\
+ <input type="button" value="Cancel" />\
+ <input type="hidden" name="parent" value="<%id%>" />\
+ <input type="hidden" name="node" value="" />\
+ </form>\
+ </div>\
+ </li>';
+
+ $(document).ready(function() {
+ init();
+ });
+})(jQuery);
+
+$(document).ready(function() {
+ // add comment anchors for all paragraphs that are commentable
+ $('.sphinx-has-comment').comment();
+
+ // highlight search words in search results
+ $("div.context").each(function() {
+ var params = $.getQueryParameters();
+ var terms = (params.q) ? params.q[0].split(/\s+/) : [];
+ var result = $(this);
+ $.each(terms, function() {
+ result.highlightText(this.toLowerCase(), 'highlighted');
+ });
+ });
+
+ // directly open comment window if requested
+ var anchor = document.location.hash;
+ if (anchor.substring(0, 9) == '#comment-') {
+ $('#ao' + anchor.substring(9)).click();
+ document.location.hash = '#s' + anchor.substring(9);
+ }
+});
diff --git a/sphinx/themes/basic/theme.conf b/sphinx/themes/basic/theme.conf
index d1fe6d1f..f7283730 100644
--- a/sphinx/themes/basic/theme.conf
+++ b/sphinx/themes/basic/theme.conf
@@ -5,3 +5,4 @@ pygments_style = none
[options]
nosidebar = false
+sidebarwidth = 230 \ No newline at end of file
diff --git a/sphinx/themes/default/static/default.css_t b/sphinx/themes/default/static/default.css_t
index ba20dca7..85c9436a 100644
--- a/sphinx/themes/default/static/default.css_t
+++ b/sphinx/themes/default/static/default.css_t
@@ -32,7 +32,7 @@ div.documentwrapper {
}
div.bodywrapper {
- margin: 0 0 0 230px;
+ margin: 0 0 0 {{ theme_sidebarwidth|toint }}px;
}
div.body {
@@ -43,7 +43,7 @@ div.body {
{%- if theme_rightsidebar|tobool %}
div.bodywrapper {
- margin: 0 230px 0 0;
+ margin: 0 {{ theme_sidebarwidth|toint }}px 0 0;
}
{%- endif %}
diff --git a/sphinx/themes/default/static/sidebar.js b/sphinx/themes/default/static/sidebar.js
index e9ef491c..a45e1926 100644
--- a/sphinx/themes/default/static/sidebar.js
+++ b/sphinx/themes/default/static/sidebar.js
@@ -29,6 +29,9 @@ $(function() {
var sidebar = $('.sphinxsidebar');
var sidebarwrapper = $('.sphinxsidebarwrapper');
+ // for some reason, the document has no sidebar; do not run into errors
+ if (!sidebar.length) return;
+
// original margin-left of the bodywrapper and width of the sidebar
// with the sidebar expanded
var bw_margin_expanded = bodywrapper.css('margin-left');
diff --git a/sphinx/themes/epub/epub-cover.html b/sphinx/themes/epub/epub-cover.html
new file mode 100644
index 00000000..f8088925
--- /dev/null
+++ b/sphinx/themes/epub/epub-cover.html
@@ -0,0 +1,24 @@
+{#
+ epub/epub-cover.html
+ ~~~~~~~~~~~~~~~~~~~~
+
+ Sample template for the html cover page.
+
+ :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
+ :license: BSD, see LICENSE for details.
+#}
+{% extends "layout.html" %}
+{%- block rootrellink %}{% endblock %}
+{%- block relbaritems %}{% endblock %}
+{%- block sidebarlogo %}{% endblock %}
+{%- block linktags %}{% endblock %}
+{%- block relbar1 %}{% endblock %}
+{%- block sidebar1 %}{% endblock %}
+{%- block sidebar2 %}{% endblock %}
+{%- block footer %}{% endblock %}
+
+{% block content %}
+ <div class="epub-cover">
+ <img src="{{ image }}" alt="Cover image" />
+ </div>
+{% endblock %}
diff --git a/sphinx/themes/nature/static/nature.css_t b/sphinx/themes/nature/static/nature.css_t
index f9986c90..a98bd420 100644
--- a/sphinx/themes/nature/static/nature.css_t
+++ b/sphinx/themes/nature/static/nature.css_t
@@ -28,7 +28,7 @@ div.documentwrapper {
}
div.bodywrapper {
- margin: 0 0 0 230px;
+ margin: 0 0 0 {{ theme_sidebarwidth|toint }}px;
}
hr {
diff --git a/sphinx/themes/pyramid/layout.html b/sphinx/themes/pyramid/layout.html
new file mode 100644
index 00000000..1887361e
--- /dev/null
+++ b/sphinx/themes/pyramid/layout.html
@@ -0,0 +1,24 @@
+{% extends "basic/layout.html" %}
+
+{%- block extrahead %}
+<link rel="stylesheet" href="http://fonts.googleapis.com/css?family=Neuton&amp;subset=latin" type="text/css" media="screen" charset="utf-8" />
+<link rel="stylesheet" href="http://fonts.googleapis.com/css?family=Nobile:regular,italic,bold,bolditalic&amp;subset=latin" type="text/css" media="screen" charset="utf-8" />
+<!--[if lte IE 6]>
+<link rel="stylesheet" href="{{ pathto('_static/ie6.css', 1) }}" type="text/css" media="screen" charset="utf-8" />
+<![endif]-->
+{% endblock %}
+
+{% block header %}
+{%- if logo %}
+<div class="header">
+ <div class="logo">
+ <a href="{{ pathto(master_doc) }}">
+ <img class="logo" src="{{ pathto('_static/' + logo, 1) }}" alt="Logo"/>
+ </a>
+ </div>
+</div>
+{%- endif %}
+{% endblock %}
+
+{%- block sidebarlogo %}{%- endblock %}
+{%- block sidebarsourcelink %}{%- endblock %}
diff --git a/sphinx/themes/pyramid/static/dialog-note.png b/sphinx/themes/pyramid/static/dialog-note.png
new file mode 100644
index 00000000..263fbd58
--- /dev/null
+++ b/sphinx/themes/pyramid/static/dialog-note.png
Binary files differ
diff --git a/sphinx/themes/pyramid/static/dialog-seealso.png b/sphinx/themes/pyramid/static/dialog-seealso.png
new file mode 100644
index 00000000..3eb7b05c
--- /dev/null
+++ b/sphinx/themes/pyramid/static/dialog-seealso.png
Binary files differ
diff --git a/sphinx/themes/pyramid/static/dialog-topic.png b/sphinx/themes/pyramid/static/dialog-topic.png
new file mode 100644
index 00000000..2ac57475
--- /dev/null
+++ b/sphinx/themes/pyramid/static/dialog-topic.png
Binary files differ
diff --git a/sphinx/themes/pyramid/static/dialog-warning.png b/sphinx/themes/pyramid/static/dialog-warning.png
new file mode 100644
index 00000000..7233d45d
--- /dev/null
+++ b/sphinx/themes/pyramid/static/dialog-warning.png
Binary files differ
diff --git a/sphinx/themes/pyramid/static/epub.css b/sphinx/themes/pyramid/static/epub.css
new file mode 100644
index 00000000..28dff738
--- /dev/null
+++ b/sphinx/themes/pyramid/static/epub.css
@@ -0,0 +1,310 @@
+/*
+ * default.css_t
+ * ~~~~~~~~~~~~~
+ *
+ * Sphinx stylesheet -- default theme.
+ *
+ * :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS.
+ * :license: BSD, see LICENSE for details.
+ *
+ */
+
+@import url("basic.css");
+
+/* -- page layout ----------------------------------------------------------- */
+
+body {
+ font-family: {{ theme_bodyfont }};
+ font-size: 100%;
+ background-color: {{ theme_footerbgcolor }};
+ color: #000;
+ margin: 0;
+ padding: 0;
+}
+
+div.document {
+ background-color: {{ theme_sidebarbgcolor }};
+}
+
+div.documentwrapper {
+ float: left;
+ width: 100%;
+}
+
+div.bodywrapper {
+ margin: 0 0 0 230px;
+}
+
+div.body {
+ background-color: {{ theme_bgcolor }};
+ color: {{ theme_textcolor }};
+ padding: 0 20px 30px 20px;
+}
+
+{%- if theme_rightsidebar|tobool %}
+div.bodywrapper {
+ margin: 0 230px 0 0;
+}
+{%- endif %}
+
+div.footer {
+ color: {{ theme_footertextcolor }};
+ width: 100%;
+ padding: 9px 0 9px 0;
+ text-align: center;
+ font-size: 75%;
+}
+
+div.footer a {
+ color: {{ theme_footertextcolor }};
+ text-decoration: underline;
+}
+
+div.related {
+ background-color: {{ theme_relbarbgcolor }};
+ line-height: 30px;
+ color: {{ theme_relbartextcolor }};
+}
+
+div.related a {
+ color: {{ theme_relbarlinkcolor }};
+}
+
+div.sphinxsidebar {
+ {%- if theme_stickysidebar|tobool %}
+ top: 30px;
+ bottom: 0;
+ margin: 0;
+ position: fixed;
+ overflow: auto;
+ height: auto;
+ {%- endif %}
+ {%- if theme_rightsidebar|tobool %}
+ float: right;
+ {%- if theme_stickysidebar|tobool %}
+ right: 0;
+ {%- endif %}
+ {%- endif %}
+}
+
+{%- if theme_stickysidebar|tobool %}
+/* this is nice, but it it leads to hidden headings when jumping
+ to an anchor */
+/*
+div.related {
+ position: fixed;
+}
+
+div.documentwrapper {
+ margin-top: 30px;
+}
+*/
+{%- endif %}
+
+div.sphinxsidebar h3 {
+ font-family: {{ theme_headfont }};
+ color: {{ theme_sidebartextcolor }};
+ font-size: 1.4em;
+ font-weight: normal;
+ margin: 0;
+ padding: 0;
+}
+
+div.sphinxsidebar h3 a {
+ color: {{ theme_sidebartextcolor }};
+}
+
+div.sphinxsidebar h4 {
+ font-family: {{ theme_headfont }};
+ color: {{ theme_sidebartextcolor }};
+ font-size: 1.3em;
+ font-weight: normal;
+ margin: 5px 0 0 0;
+ padding: 0;
+}
+
+div.sphinxsidebar p {
+ color: {{ theme_sidebartextcolor }};
+}
+
+div.sphinxsidebar p.topless {
+ margin: 5px 10px 10px 10px;
+}
+
+div.sphinxsidebar ul {
+ margin: 10px;
+ padding: 0;
+ color: {{ theme_sidebartextcolor }};
+}
+
+div.sphinxsidebar a {
+ color: {{ theme_sidebarlinkcolor }};
+}
+
+div.sphinxsidebar input {
+ border: 1px solid {{ theme_sidebarlinkcolor }};
+ font-family: sans-serif;
+ font-size: 1em;
+}
+
+{% if theme_collapsiblesidebar|tobool %}
+/* for collapsible sidebar */
+div#sidebarbutton {
+ background-color: {{ theme_sidebarbtncolor }};
+}
+{% endif %}
+
+/* -- hyperlink styles ------------------------------------------------------ */
+
+a {
+ color: {{ theme_linkcolor }};
+ text-decoration: none;
+}
+
+a:visited {
+ color: {{ theme_visitedlinkcolor }};
+ text-decoration: none;
+}
+
+a:hover {
+ text-decoration: underline;
+}
+
+{% if theme_externalrefs|tobool %}
+a.external {
+ text-decoration: none;
+ border-bottom: 1px dashed {{ theme_linkcolor }};
+}
+
+a.external:hover {
+ text-decoration: none;
+ border-bottom: none;
+}
+
+a.external:visited {
+ text-decoration: none;
+ border-bottom: 1px dashed {{ theme_visitedlinkcolor }};
+}
+{% endif %}
+
+/* -- body styles ----------------------------------------------------------- */
+
+div.body h1,
+div.body h2,
+div.body h3,
+div.body h4,
+div.body h5,
+div.body h6 {
+ font-family: {{ theme_headfont }};
+ background-color: {{ theme_headbgcolor }};
+ font-weight: normal;
+ color: {{ theme_headtextcolor }};
+ border-bottom: 1px solid #ccc;
+ margin: 20px -20px 10px -20px;
+ padding: 3px 0 3px 10px;
+}
+
+div.body h1 { margin-top: 0; font-size: 200%; }
+div.body h2 { font-size: 160%; }
+div.body h3 { font-size: 140%; }
+div.body h4 { font-size: 120%; }
+div.body h5 { font-size: 110%; }
+div.body h6 { font-size: 100%; }
+
+a.headerlink {
+ color: {{ theme_headlinkcolor }};
+ font-size: 0.8em;
+ padding: 0 4px 0 4px;
+ text-decoration: none;
+}
+
+a.headerlink:hover {
+ background-color: {{ theme_headlinkcolor }};
+ color: white;
+}
+
+div.body p, div.body dd, div.body li {
+ text-align: justify;
+ line-height: 130%;
+}
+
+div.admonition p.admonition-title + p {
+ display: inline;
+}
+
+div.admonition p {
+ margin-bottom: 5px;
+}
+
+div.admonition pre {
+ margin-bottom: 5px;
+}
+
+div.admonition ul, div.admonition ol {
+ margin-bottom: 5px;
+}
+
+div.note {
+ background-color: #eee;
+ border: 1px solid #ccc;
+}
+
+div.seealso {
+ background-color: #ffc;
+ border: 1px solid #ff6;
+}
+
+div.topic {
+ background-color: #eee;
+}
+
+div.warning {
+ background-color: #ffe4e4;
+ border: 1px solid #f66;
+}
+
+p.admonition-title {
+ display: inline;
+}
+
+p.admonition-title:after {
+ content: ":";
+}
+
+pre {
+ padding: 5px;
+ background-color: {{ theme_codebgcolor }};
+ color: {{ theme_codetextcolor }};
+ line-height: 120%;
+ border: 1px solid #ac9;
+ border-left: none;
+ border-right: none;
+}
+
+tt {
+ background-color: #ecf0f3;
+ padding: 0 1px 0 1px;
+ font-size: 0.95em;
+}
+
+th {
+ background-color: #ede;
+}
+
+.warning tt {
+ background: #efc2c2;
+}
+
+.note tt {
+ background: #d6d6d6;
+}
+
+.viewcode-back {
+ font-family: {{ theme_bodyfont }};
+}
+
+div.viewcode-block:target {
+ background-color: #f4debf;
+ border-top: 1px solid #ac9;
+ border-bottom: 1px solid #ac9;
+}
diff --git a/sphinx/themes/pyramid/static/footerbg.png b/sphinx/themes/pyramid/static/footerbg.png
new file mode 100644
index 00000000..1fbc873d
--- /dev/null
+++ b/sphinx/themes/pyramid/static/footerbg.png
Binary files differ
diff --git a/sphinx/themes/pyramid/static/headerbg.png b/sphinx/themes/pyramid/static/headerbg.png
new file mode 100644
index 00000000..0596f202
--- /dev/null
+++ b/sphinx/themes/pyramid/static/headerbg.png
Binary files differ
diff --git a/sphinx/themes/pyramid/static/ie6.css b/sphinx/themes/pyramid/static/ie6.css
new file mode 100644
index 00000000..74baa5d5
--- /dev/null
+++ b/sphinx/themes/pyramid/static/ie6.css
@@ -0,0 +1,7 @@
+* html img,
+* html .png{position:relative;behavior:expression((this.runtimeStyle.behavior="none")&&(this.pngSet?this.pngSet=true:(this.nodeName == "IMG" && this.src.toLowerCase().indexOf('.png')>-1?(this.runtimeStyle.backgroundImage = "none",
+this.runtimeStyle.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + this.src + "',sizingMethod='image')",
+this.src = "_static/transparent.gif"):(this.origBg = this.origBg? this.origBg :this.currentStyle.backgroundImage.toString().replace('url("','').replace('")',''),
+this.runtimeStyle.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + this.origBg + "',sizingMethod='crop')",
+this.runtimeStyle.backgroundImage = "none")),this.pngSet=true)
+);}
diff --git a/sphinx/themes/pyramid/static/middlebg.png b/sphinx/themes/pyramid/static/middlebg.png
new file mode 100644
index 00000000..2369cfb7
--- /dev/null
+++ b/sphinx/themes/pyramid/static/middlebg.png
Binary files differ
diff --git a/sphinx/themes/pyramid/static/pyramid.css_t b/sphinx/themes/pyramid/static/pyramid.css_t
new file mode 100644
index 00000000..442cbec0
--- /dev/null
+++ b/sphinx/themes/pyramid/static/pyramid.css_t
@@ -0,0 +1,323 @@
+/*
+ * pylons.css_t
+ * ~~~~~~~~~~~~
+ *
+ * Sphinx stylesheet -- pylons theme.
+ *
+ * :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS.
+ * :license: BSD, see LICENSE for details.
+ *
+ */
+
+@import url("basic.css");
+
+/* -- page layout ----------------------------------------------------------- */
+
+body {
+ font-family: "Nobile", sans-serif;
+ font-size: 100%;
+ background-color: #393939;
+ color: #ffffff;
+ margin: 0;
+ padding: 0;
+}
+
+div.documentwrapper {
+ float: left;
+ width: 100%;
+}
+
+div.bodywrapper {
+ margin: 0 0 0 {{ theme_sidebarwidth }}px;
+}
+
+hr {
+ border: 1px solid #B1B4B6;
+}
+
+div.document {
+ background-color: #eee;
+}
+
+div.header {
+ width:100%;
+ background: #f4ad32 url(headerbg.png) repeat-x 0 top;
+ border-bottom: 2px solid #ffffff;
+}
+
+div.logo {
+ text-align: center;
+ padding-top: 10px;
+}
+
+div.body {
+ background-color: #ffffff;
+ color: #3E4349;
+ padding: 0 30px 30px 30px;
+ font-size: 1em;
+ border: 2px solid #ddd;
+ border-right-style: none;
+ overflow: auto;
+}
+
+div.footer {
+ color: #ffffff;
+ width: 100%;
+ padding: 13px 0;
+ text-align: center;
+ font-size: 75%;
+ background: transparent;
+ clear:both;
+}
+
+div.footer a {
+ color: #ffffff;
+ text-decoration: none;
+}
+
+div.footer a:hover {
+ color: #e88f00;
+ text-decoration: underline;
+}
+
+div.related {
+ line-height: 30px;
+ color: #373839;
+ font-size: 0.8em;
+ background-color: #eee;
+}
+
+div.related a {
+ color: #1b61d6;
+}
+
+div.related ul {
+ padding-left: {{ theme_sidebarwidth|toint + 10 }}px;
+}
+
+div.sphinxsidebar {
+ font-size: 0.75em;
+ line-height: 1.5em;
+}
+
+div.sphinxsidebarwrapper{
+ padding: 10px 0;
+}
+
+div.sphinxsidebar h3,
+div.sphinxsidebar h4 {
+ font-family: "Neuton", sans-serif;
+ color: #373839;
+ font-size: 1.4em;
+ font-weight: normal;
+ margin: 0;
+ padding: 5px 10px;
+ border-bottom: 2px solid #ddd;
+}
+
+div.sphinxsidebar h4{
+ font-size: 1.3em;
+}
+
+div.sphinxsidebar h3 a {
+ color: #000000;
+}
+
+
+div.sphinxsidebar p {
+ color: #888;
+ padding: 5px 20px;
+}
+
+div.sphinxsidebar p.topless {
+}
+
+div.sphinxsidebar ul {
+ margin: 10px 20px;
+ padding: 0;
+ color: #373839;
+}
+
+div.sphinxsidebar a {
+ color: #444;
+}
+
+div.sphinxsidebar input {
+ border: 1px solid #ccc;
+ font-family: sans-serif;
+ font-size: 1em;
+}
+
+div.sphinxsidebar input[type=text]{
+ margin-left: 20px;
+}
+
+/* -- sidebars -------------------------------------------------------------- */
+
+div.sidebar {
+ margin: 0 0 0.5em 1em;
+ border: 2px solid #c6d880;
+ background-color: #e6efc2;
+ width: 40%;
+ float: right;
+ border-right-style: none;
+ border-left-style: none;
+ padding: 10px 20px;
+}
+
+p.sidebar-title {
+ font-weight: bold;
+}
+
+/* -- body styles ----------------------------------------------------------- */
+
+a, a .pre {
+ color: #1b61d6;
+ text-decoration: none;
+}
+
+a:hover, a:hover .pre {
+ text-decoration: underline;
+}
+
+div.body h1,
+div.body h2,
+div.body h3,
+div.body h4,
+div.body h5,
+div.body h6 {
+ font-family: "Neuton", sans-serif;
+ background-color: #ffffff;
+ font-weight: normal;
+ color: #373839;
+ margin: 30px 0px 10px 0px;
+ padding: 5px 0;
+}
+
+div.body h1 { border-top: 20px solid white; margin-top: 0; font-size: 200%; }
+div.body h2 { font-size: 150%; background-color: #ffffff; }
+div.body h3 { font-size: 120%; background-color: #ffffff; }
+div.body h4 { font-size: 110%; background-color: #ffffff; }
+div.body h5 { font-size: 100%; background-color: #ffffff; }
+div.body h6 { font-size: 100%; background-color: #ffffff; }
+
+a.headerlink {
+ color: #1b61d6;
+ font-size: 0.8em;
+ padding: 0 4px 0 4px;
+ text-decoration: none;
+}
+
+a.headerlink:hover {
+ text-decoration: underline;
+}
+
+div.body p, div.body dd, div.body li {
+ line-height: 1.5em;
+}
+
+div.admonition p.admonition-title + p {
+ display: inline;
+}
+
+div.highlight{
+ background-color: white;
+}
+
+div.note {
+ border: 2px solid #7a9eec;
+ border-right-style: none;
+ border-left-style: none;
+ padding: 10px 20px 10px 60px;
+ background: #e1ecfe url(dialog-note.png) no-repeat 10px 8px;
+}
+
+div.seealso {
+ background: #fff6bf url(dialog-seealso.png) no-repeat 10px 8px;
+ border: 2px solid #ffd324;
+ border-left-style: none;
+ border-right-style: none;
+ padding: 10px 20px 10px 60px;
+}
+
+div.topic {
+ background: #eeeeee;
+ border: 2px solid #C6C9CB;
+ padding: 10px 20px;
+ border-right-style: none;
+ border-left-style: none;
+}
+
+div.warning {
+ background: #fbe3e4 url(dialog-warning.png) no-repeat 10px 8px;
+ border: 2px solid #fbc2c4;
+ border-right-style: none;
+ border-left-style: none;
+ padding: 10px 20px 10px 60px;
+}
+
+p.admonition-title {
+ display: none;
+}
+
+p.admonition-title:after {
+ content: ":";
+}
+
+pre {
+ padding: 10px;
+ background-color: #fafafa;
+ color: #222;
+ line-height: 1.2em;
+ border: 2px solid #C6C9CB;
+ font-size: 1.1em;
+ margin: 1.5em 0 1.5em 0;
+ border-right-style: none;
+ border-left-style: none;
+}
+
+tt {
+ background-color: transparent;
+ color: #222;
+ font-size: 1.1em;
+ font-family: monospace;
+}
+
+.viewcode-back {
+ font-family: "Nobile", sans-serif;
+}
+
+div.viewcode-block:target {
+ background-color: #fff6bf;
+ border: 2px solid #ffd324;
+ border-left-style: none;
+ border-right-style: none;
+ padding: 10px 20px;
+}
+
+table.highlighttable {
+ width: 100%;
+}
+
+table.highlighttable td {
+ padding: 0;
+}
+
+a em.std-term {
+ color: #007f00;
+}
+
+a:hover em.std-term {
+ text-decoration: underline;
+}
+
+.download {
+ font-family: "Nobile", sans-serif;
+ font-weight: normal;
+ font-style: normal;
+}
+
+tt.xref {
+ font-weight: normal;
+ font-style: normal;
+}
diff --git a/sphinx/themes/pyramid/static/transparent.gif b/sphinx/themes/pyramid/static/transparent.gif
new file mode 100644
index 00000000..0341802e
--- /dev/null
+++ b/sphinx/themes/pyramid/static/transparent.gif
Binary files differ
diff --git a/sphinx/themes/pyramid/theme.conf b/sphinx/themes/pyramid/theme.conf
new file mode 100644
index 00000000..409579fd
--- /dev/null
+++ b/sphinx/themes/pyramid/theme.conf
@@ -0,0 +1,4 @@
+[theme]
+inherit = basic
+stylesheet = pyramid.css
+pygments_style = sphinx.pygments_styles.PyramidStyle
diff --git a/sphinx/themes/sphinxdoc/static/sphinxdoc.css b/sphinx/themes/sphinxdoc/static/sphinxdoc.css_t
index 0a428074..f535696b 100644
--- a/sphinx/themes/sphinxdoc/static/sphinxdoc.css
+++ b/sphinx/themes/sphinxdoc/static/sphinxdoc.css_t
@@ -38,7 +38,7 @@ div.document {
}
div.bodywrapper {
- margin: 0 240px 0 0;
+ margin: 0 {{ theme_sidebarwidth|toint + 10 }}px 0 0;
border-right: 1px solid #ccc;
}
@@ -88,7 +88,7 @@ div.sphinxsidebarwrapper {
div.sphinxsidebar {
margin: 0;
padding: 0.5em 15px 15px 0;
- width: 210px;
+ width: {{ theme_sidebarwidth|toint - 20 }}px;
float: right;
font-size: 1em;
text-align: left;
diff --git a/sphinx/themes/traditional/static/traditional.css b/sphinx/themes/traditional/static/traditional.css_t
index bac58c0d..51567255 100644
--- a/sphinx/themes/traditional/static/traditional.css
+++ b/sphinx/themes/traditional/static/traditional.css_t
@@ -23,7 +23,7 @@ div.documentwrapper {
}
div.bodywrapper {
- margin: 0 230px 0 0;
+ margin: 0 {{ theme_sidebarwidth }}px 0 0;
}
div.body {
@@ -40,7 +40,7 @@ div.sphinxsidebarwrapper {
div.sphinxsidebar {
float: right;
margin-left: -100%;
- width: 230px;
+ width: {{ theme_sidebarwidth }}px;
}
div.clearer {
@@ -667,38 +667,6 @@ h1 tt, h2 tt, h3 tt, h4 tt, h5 tt, h6 tt {
font-style: italic;
}
-form.comment {
- margin: 0;
- padding: 10px 30px 10px 30px;
- background-color: #eee;
-}
-
-form.comment h3 {
- background-color: #326591;
- color: white;
- margin: -10px -30px 10px -30px;
- padding: 5px;
- font-size: 1.4em;
-}
-
-form.comment input,
-form.comment textarea {
- border: 1px solid #ccc;
- padding: 2px;
- font-family: sans-serif;
- font-size: 13px;
-}
-
-form.comment input[type="text"] {
- width: 240px;
-}
-
-form.comment textarea {
- width: 100%;
- height: 200px;
- margin-bottom: 10px;
-}
-
/* :::: PRINT :::: */
@media print {
div.documentwrapper {
diff --git a/sphinx/theming.py b/sphinx/theming.py
index ebc88d27..68d11a49 100644
--- a/sphinx/theming.py
+++ b/sphinx/theming.py
@@ -30,13 +30,13 @@ class Theme(object):
themes = {}
@classmethod
- def init_themes(cls, builder):
+ def init_themes(cls, confdir, theme_path, warn=None):
"""Search all theme paths for available themes."""
- cls.themepath = list(builder.config.html_theme_path)
+ cls.themepath = list(theme_path)
cls.themepath.append(path.join(package_dir, 'themes'))
for themedir in cls.themepath[::-1]:
- themedir = path.join(builder.confdir, themedir)
+ themedir = path.join(confdir, themedir)
if not path.isdir(themedir):
continue
for theme in os.listdir(themedir):
@@ -48,8 +48,9 @@ class Theme(object):
tname = theme[:-4]
tinfo = zfile
except Exception:
- builder.warn('file %r on theme path is not a valid '
- 'zipfile or contains no theme' % theme)
+ if warn:
+ warn('file %r on theme path is not a valid '
+ 'zipfile or contains no theme' % theme)
continue
else:
if not path.isfile(path.join(themedir, theme, THEMECONF)):
@@ -98,8 +99,7 @@ class Theme(object):
self.base = Theme(inherit)
def get_confstr(self, section, name, default=NODEFAULT):
- """
- Return the value for a theme configuration setting, searching the
+ """Return the value for a theme configuration setting, searching the
base theme chain.
"""
try:
@@ -114,9 +114,7 @@ class Theme(object):
return default
def get_options(self, overrides):
- """
- Return a dictionary of theme options and their values.
- """
+ """Return a dictionary of theme options and their values."""
chain = [self.themeconf]
base = self.base
while base is not None:
@@ -135,8 +133,7 @@ class Theme(object):
return options
def get_dirchain(self):
- """
- Return a list of theme directories, beginning with this theme's,
+ """Return a list of theme directories, beginning with this theme's,
then the base theme's, then that one's base theme's, etc.
"""
chain = [self.themedir]
@@ -147,9 +144,7 @@ class Theme(object):
return chain
def cleanup(self):
- """
- Remove temporary directories.
- """
+ """Remove temporary directories."""
if self.themedir_created:
try:
shutil.rmtree(self.themedir)
diff --git a/sphinx/util/__init__.py b/sphinx/util/__init__.py
index d2b9193c..0d67da82 100644
--- a/sphinx/util/__init__.py
+++ b/sphinx/util/__init__.py
@@ -18,7 +18,8 @@ import tempfile
import posixpath
import traceback
from os import path
-from codecs import BOM_UTF8
+from codecs import open, BOM_UTF8
+from collections import deque
import docutils
from docutils.utils import relative_path
@@ -49,8 +50,7 @@ def docname_join(basedocname, docname):
def get_matching_files(dirname, exclude_matchers=()):
- """
- Get all file names in a directory, recursively.
+ """Get all file names in a directory, recursively.
Exclude files and dirs matching some matcher in *exclude_matchers*.
"""
@@ -76,9 +76,8 @@ def get_matching_files(dirname, exclude_matchers=()):
def get_matching_docs(dirname, suffix, exclude_matchers=()):
- """
- Get all file names (without suffix) matching a suffix in a
- directory, recursively.
+ """Get all file names (without suffix) matching a suffix in a directory,
+ recursively.
Exclude files and dirs matching a pattern in *exclude_patterns*.
"""
@@ -141,8 +140,8 @@ def copy_static_entry(source, targetdir, builder, context={},
target = path.join(targetdir, path.basename(source))
if source.lower().endswith('_t') and builder.templates:
# templated!
- fsrc = open(source, 'rb')
- fdst = open(target[:-2], 'wb')
+ fsrc = open(source, 'r', encoding='utf-8')
+ fdst = open(target[:-2], 'w', encoding='utf-8')
fdst.write(builder.templates.render_string(fsrc.read(), context))
fsrc.close()
fdst.close()
@@ -163,19 +162,24 @@ def copy_static_entry(source, targetdir, builder, context={},
shutil.copytree(source, target)
+_DEBUG_HEADER = '''\
+# Sphinx version: %s
+# Python version: %s
+# Docutils version: %s %s
+# Jinja2 version: %s
+'''
+
def save_traceback():
- """
- Save the current exception's traceback in a temporary file.
- """
+ """Save the current exception's traceback in a temporary file."""
import platform
exc = traceback.format_exc()
fd, path = tempfile.mkstemp('.log', 'sphinx-err-')
- os.write(fd, '# Sphinx version: %s\n' % sphinx.__version__)
- os.write(fd, '# Python version: %s\n' % platform.python_version())
- os.write(fd, '# Docutils version: %s %s\n' % (docutils.__version__,
- docutils.__version_details__))
- os.write(fd, '# Jinja2 version: %s\n' % jinja2.__version__)
- os.write(fd, exc)
+ os.write(fd, (_DEBUG_HEADER %
+ (sphinx.__version__,
+ platform.python_version(),
+ docutils.__version__, docutils.__version_details__,
+ jinja2.__version__)).encode('utf-8'))
+ os.write(fd, exc.encode('utf-8'))
os.close(fd)
return path
@@ -283,8 +287,7 @@ class Tee(object):
def parselinenos(spec, total):
- """
- Parse a line number spec (such as "1,2,4-6") and return a list of
+ """Parse a line number spec (such as "1,2,4-6") and return a list of
wanted line numbers.
"""
items = list()
@@ -337,10 +340,16 @@ def rpartition(s, t):
return '', s
+def split_into(n, type, value):
+ """Split an index entry into a given number of parts at semicolons."""
+ parts = map(lambda x: x.strip(), value.split(';', n-1))
+ if sum(1 for part in parts if part) < n:
+ raise ValueError('invalid %s index entry %r' % (type, value))
+ return parts
+
+
def format_exception_cut_frames(x=1):
- """
- Format an exception with traceback, but only the last x frames.
- """
+ """Format an exception with traceback, but only the last x frames."""
typ, val, tb = sys.exc_info()
#res = ['Traceback (most recent call last):\n']
res = []
@@ -348,3 +357,34 @@ def format_exception_cut_frames(x=1):
res += tbres[-x:]
res += traceback.format_exception_only(typ, val)
return ''.join(res)
+
+
+class PeekableIterator(object):
+ """
+ An iterator which wraps any iterable and makes it possible to peek to see
+ what's the next item.
+ """
+ def __init__(self, iterable):
+ self.remaining = deque()
+ self._iterator = iter(iterable)
+
+ def __iter__(self):
+ return self
+
+ def next(self):
+ """Return the next item from the iterator."""
+ if self.remaining:
+ return self.remaining.popleft()
+ return self._iterator.next()
+
+ def push(self, item):
+ """Push the `item` on the internal stack, it will be returned on the
+ next :meth:`next` call.
+ """
+ self.remaining.append(item)
+
+ def peek(self):
+ """Return the next item without changing the state of the iterator."""
+ item = self.next()
+ self.push(item)
+ return item
diff --git a/sphinx/util/compat.py b/sphinx/util/compat.py
index 1a263cff..bdb00845 100644
--- a/sphinx/util/compat.py
+++ b/sphinx/util/compat.py
@@ -11,7 +11,6 @@
from docutils import nodes
-# function missing in docutils 0.5
def make_admonition(node_class, name, arguments, options, content, lineno,
content_offset, block_text, state, state_machine):
#if not content:
diff --git a/sphinx/util/docstrings.py b/sphinx/util/docstrings.py
index fca79c3f..ba81bf00 100644
--- a/sphinx/util/docstrings.py
+++ b/sphinx/util/docstrings.py
@@ -12,26 +12,29 @@
import sys
-def prepare_docstring(s):
- """
- Convert a docstring into lines of parseable reST. Return it as a list of
- lines usable for inserting into a docutils ViewList (used as argument
- of nested_parse().) An empty line is added to act as a separator between
- this docstring and following content.
+def prepare_docstring(s, ignore=1):
+ """Convert a docstring into lines of parseable reST. Remove common leading
+ indentation, where the indentation of a given number of lines (usually just
+ one) is ignored.
+
+ Return the docstring as a list of lines usable for inserting into a docutils
+ ViewList (used as argument of nested_parse().) An empty line is added to
+ act as a separator between this docstring and following content.
"""
lines = s.expandtabs().splitlines()
- # Find minimum indentation of any non-blank lines after first line.
+ # Find minimum indentation of any non-blank lines after ignored lines.
margin = sys.maxint
- for line in lines[1:]:
+ for line in lines[ignore:]:
content = len(line.lstrip())
if content:
indent = len(line) - content
margin = min(margin, indent)
- # Remove indentation.
- if lines:
- lines[0] = lines[0].lstrip()
+ # Remove indentation from ignored lines.
+ for i in range(ignore):
+ if i < len(lines):
+ lines[i] = lines[i].lstrip()
if margin < sys.maxint:
- for i in range(1, len(lines)): lines[i] = lines[i][margin:]
+ for i in range(ignore, len(lines)): lines[i] = lines[i][margin:]
# Remove any leading blank lines.
while lines and not lines[0]:
lines.pop(0)
@@ -42,9 +45,8 @@ def prepare_docstring(s):
def prepare_commentdoc(s):
- """
- Extract documentation comment lines (starting with #:) and return them as a
- list of lines. Returns an empty list if there is no documentation.
+ """Extract documentation comment lines (starting with #:) and return them
+ as a list of lines. Returns an empty list if there is no documentation.
"""
result = []
lines = [line.strip() for line in s.expandtabs().splitlines()]
diff --git a/sphinx/util/inspect.py b/sphinx/util/inspect.py
index a0574003..ff6c222d 100644
--- a/sphinx/util/inspect.py
+++ b/sphinx/util/inspect.py
@@ -9,6 +9,44 @@
:license: BSD, see LICENSE for details.
"""
+import sys
+
+# this imports the standard library inspect module without resorting to
+# relatively import this module
+inspect = __import__('inspect')
+
+
+if sys.version_info >= (2, 5):
+ from functools import partial
+ def getargspec(func):
+ """Like inspect.getargspec but supports functools.partial as well."""
+ if inspect.ismethod(func):
+ func = func.im_func
+ parts = 0, ()
+ if type(func) is partial:
+ parts = len(func.args), func.keywords.keys()
+ func = func.func
+ if not inspect.isfunction(func):
+ raise TypeError('%r is not a Python function' % func)
+ args, varargs, varkw = inspect.getargs(func.func_code)
+ func_defaults = func.func_defaults
+ if func_defaults:
+ func_defaults = list(func_defaults)
+ if parts[0]:
+ args = args[parts[0]:]
+ if parts[1]:
+ for arg in parts[1]:
+ i = args.index(arg) - len(args)
+ del args[i]
+ try:
+ del func_defaults[i]
+ except IndexError:
+ pass
+ return inspect.ArgSpec(args, varargs, varkw, func_defaults)
+else:
+ getargspec = inspect.getargspec
+
+
def isdescriptor(x):
"""Check if the object is some kind of descriptor."""
for item in '__get__', '__set__', '__delete__':
@@ -41,3 +79,12 @@ def safe_getmembers(object, predicate=None):
results.append((key, value))
results.sort()
return results
+
+
+def safe_repr(object):
+ """A repr() implementation that returns text safe to use in reST context."""
+ try:
+ s = repr(object)
+ except Exception:
+ raise ValueError
+ return s.replace('\n', ' ')
diff --git a/sphinx/util/jsdump.py b/sphinx/util/jsdump.py
index a0f6d0e3..191e2419 100644
--- a/sphinx/util/jsdump.py
+++ b/sphinx/util/jsdump.py
@@ -12,6 +12,8 @@
import re
+from sphinx.util.pycompat import u
+
_str_re = re.compile(r'"(\\\\|\\"|[^"])*"')
_int_re = re.compile(r'\d+')
_name_re = re.compile(r'[a-zA-Z]\w*')
@@ -50,7 +52,7 @@ def encode_string(s):
return '"' + str(ESCAPE_ASCII.sub(replace, s)) + '"'
def decode_string(s):
- return ESCAPED.sub(lambda m: eval('u"'+m.group()+'"'), s)
+ return ESCAPED.sub(lambda m: eval(u + '"' + m.group() + '"'), s)
reswords = set("""\
diff --git a/sphinx/util/jsonimpl.py b/sphinx/util/jsonimpl.py
index b1982d9f..cf5ddb42 100644
--- a/sphinx/util/jsonimpl.py
+++ b/sphinx/util/jsonimpl.py
@@ -13,7 +13,7 @@ import UserString
try:
import json
- # json-py's json module has not JSONEncoder; this will raise AttributeError
+ # json-py's json module has no JSONEncoder; this will raise AttributeError
# if json-py is imported instead of the built-in json module
JSONEncoder = json.JSONEncoder
except (ImportError, AttributeError):
diff --git a/sphinx/util/matching.py b/sphinx/util/matching.py
index d358a2a0..fa6cb7e0 100644
--- a/sphinx/util/matching.py
+++ b/sphinx/util/matching.py
@@ -13,8 +13,7 @@ import re
def _translate_pattern(pat):
- """
- Translate a shell-style glob pattern to a regular expression.
+ """Translate a shell-style glob pattern to a regular expression.
Adapted from the fnmatch module, but enhanced so that single stars don't
match slashes.
@@ -65,16 +64,14 @@ def compile_matchers(patterns):
_pat_cache = {}
def patmatch(name, pat):
- """
- Return if name matches pat. Adapted from fnmatch module.
- """
+ """Return if name matches pat. Adapted from fnmatch module."""
if pat not in _pat_cache:
_pat_cache[pat] = re.compile(_translate_pattern(pat))
return _pat_cache[pat].match(name)
def patfilter(names, pat):
- """
- Return the subset of the list NAMES that match PAT.
+ """Return the subset of the list NAMES that match PAT.
+
Adapted from fnmatch module.
"""
if pat not in _pat_cache:
diff --git a/sphinx/util/nodes.py b/sphinx/util/nodes.py
index b7b5073d..c2b7edf4 100644
--- a/sphinx/util/nodes.py
+++ b/sphinx/util/nodes.py
@@ -10,12 +10,11 @@
"""
import re
-import types
from docutils import nodes
-from docutils.statemachine import StateMachine
from sphinx import addnodes
+from sphinx.locale import pairindextypes
class WarningStream(object):
@@ -34,8 +33,38 @@ class WarningStream(object):
explicit_title_re = re.compile(r'^(.+?)\s*(?<!\x00)<(.*?)>$', re.DOTALL)
caption_ref_re = explicit_title_re # b/w compat alias
+IGNORED_NODES = (
+ nodes.Invisible,
+ nodes.Inline,
+ nodes.literal_block,
+ nodes.doctest_block,
+ #XXX there are probably more
+)
+def extract_messages(doctree):
+ """Extract translatable messages from a document tree."""
+ for node in doctree.traverse(nodes.TextElement):
+ if not node.source:
+ continue # built-in message
+ if isinstance(node, IGNORED_NODES):
+ continue
+ # <field_name>orphan</field_name>
+ # XXX ignore all metadata (== docinfo)
+ if isinstance(node, nodes.field_name) and node.children[0] == 'orphan':
+ continue
+
+ msg = node.rawsource.replace('\n', ' ').strip()
+ # XXX nodes rendering empty are likely a bug in sphinx.addnodes
+ if msg:
+ yield node, msg
+
def nested_parse_with_titles(state, content, node):
+ """Version of state.nested_parse() that allows titles and does not require
+ titles to have the same decoration as the calling document.
+
+ This is useful when the parsed content comes from a completely different
+ context, such as docstrings.
+ """
# hack around title style bookkeeping
surrounding_title_styles = state.memo.title_styles
surrounding_section_level = state.memo.section_level
@@ -64,6 +93,46 @@ def split_explicit_title(text):
return False, text, text
+indextypes = [
+ 'single', 'pair', 'double', 'triple', 'see', 'seealso',
+]
+
+def process_index_entry(entry, targetid):
+ indexentries = []
+ entry = entry.strip()
+ oentry = entry
+ main = ''
+ if entry.startswith('!'):
+ main = 'main'
+ entry = entry[1:].lstrip()
+ for type in pairindextypes:
+ if entry.startswith(type+':'):
+ value = entry[len(type)+1:].strip()
+ value = pairindextypes[type] + '; ' + value
+ indexentries.append(('pair', value, targetid, main))
+ break
+ else:
+ for type in indextypes:
+ if entry.startswith(type+':'):
+ value = entry[len(type)+1:].strip()
+ if type == 'double':
+ type = 'pair'
+ indexentries.append((type, value, targetid, main))
+ break
+ # shorthand notation for single entries
+ else:
+ for value in oentry.split(','):
+ value = value.strip()
+ main = ''
+ if value.startswith('!'):
+ main = 'main'
+ value = value[1:].lstrip()
+ if not value:
+ continue
+ indexentries.append(('single', value, targetid, main))
+ return indexentries
+
+
def inline_all_toctrees(builder, docnameset, docname, tree, colorfunc):
"""Inline all toctrees in the *tree*.
@@ -105,53 +174,13 @@ def make_refnode(builder, fromdocname, todocname, targetid, child, title=None):
return node
-if hasattr(StateMachine, 'get_source_and_line'):
- def set_source_info(directive, node):
- node.source, node.line = \
- directive.state_machine.get_source_and_line(directive.lineno)
- def set_role_source_info(inliner, lineno, node):
+def set_source_info(directive, node):
+ node.source, node.line = \
+ directive.state_machine.get_source_and_line(directive.lineno)
+
+def set_role_source_info(inliner, lineno, node):
node.source, node.line = \
inliner.reporter.locator(lineno)
-else:
- # docutils <= 0.6 compatibility
- def set_source_info(directive, node):
- node.line = directive.lineno
- def set_role_source_info(inliner, lineno, node):
- node.line = lineno
-
-# 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, result):
- """Version of Node.traverse() that doesn't need a condition."""
- result.append(self)
- for child in self.children:
- child._all_traverse(result)
- return result
-
-def _fast_traverse(self, cls, result):
- """Version of Node.traverse() that only supports instance checks."""
- if isinstance(self, cls):
- result.append(self)
- for child in self.children:
- child._fast_traverse(cls, result)
- 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)
-
-nodes.Node._old_traverse = nodes.Node.traverse
-nodes.Node._all_traverse = _all_traverse
-nodes.Node._fast_traverse = _fast_traverse
-nodes.Node.traverse = _new_traverse
# monkey-patch Node.__contains__ to get consistent "in" operator behavior
# across docutils versions
diff --git a/sphinx/util/osutil.py b/sphinx/util/osutil.py
index 6aeb2f4f..ee6a6c85 100644
--- a/sphinx/util/osutil.py
+++ b/sphinx/util/osutil.py
@@ -11,6 +11,7 @@
import os
import re
+import sys
import time
import errno
import shutil
@@ -20,6 +21,7 @@ from os import path
EEXIST = getattr(errno, 'EEXIST', 0)
ENOENT = getattr(errno, 'ENOENT', 0)
EPIPE = getattr(errno, 'EPIPE', 0)
+EINVAL = getattr(errno, 'EINVAL', 0)
# SEP separates path elements in the canonical file names
#
@@ -58,8 +60,8 @@ def ensuredir(path):
def walk(top, topdown=True, followlinks=False):
- """
- Backport of os.walk from 2.6, where the followlinks argument was added.
+ """Backport of os.walk from 2.6, where the *followlinks* argument was
+ added.
"""
names = os.listdir(top)
@@ -124,7 +126,20 @@ no_fn_re = re.compile(r'[^a-zA-Z0-9_-]')
def make_filename(string):
return no_fn_re.sub('', string)
+if sys.version_info < (3, 0):
+ def ustrftime(format, *args):
+ # strftime for unicode strings
+ return time.strftime(unicode(format).encode('utf-8'), *args) \
+ .decode('utf-8')
+else:
+ ustrftime = time.strftime
+
+
+def safe_relpath(path, start=None):
+ try:
+ return os.path.relpath(path, start)
+ except ValueError:
+ return path
-def ustrftime(format, *args):
- # strftime for unicode strings
- return time.strftime(unicode(format).encode('utf-8'), *args).decode('utf-8')
+def find_catalog(docname, compaction):
+ return docname.split(SEP, 1)[0] if compaction else docname
diff --git a/sphinx/util/png.py b/sphinx/util/png.py
index 5450bccf..50c72efd 100644
--- a/sphinx/util/png.py
+++ b/sphinx/util/png.py
@@ -12,18 +12,18 @@
import struct
import binascii
+from sphinx.util.pycompat import b
+
LEN_IEND = 12
LEN_DEPTH = 22
DEPTH_CHUNK_LEN = struct.pack('!i', 10)
-DEPTH_CHUNK_START = 'tEXtDepth\x00'
-IEND_CHUNK = '\x00\x00\x00\x00IEND\xAE\x42\x60\x82'
+DEPTH_CHUNK_START = b('tEXtDepth\x00')
+IEND_CHUNK = b('\x00\x00\x00\x00IEND\xAE\x42\x60\x82')
def read_png_depth(filename):
- """
- Read the special tEXt chunk indicating the depth from a PNG file.
- """
+ """Read the special tEXt chunk indicating the depth from a PNG file."""
result = None
f = open(filename, 'rb')
try:
@@ -39,8 +39,8 @@ def read_png_depth(filename):
def write_png_depth(filename, depth):
- """
- Write the special tEXt chunk indicating the depth to a PNG file.
+ """Write the special tEXt chunk indicating the depth to a PNG file.
+
The chunk is placed immediately before the special IEND chunk.
"""
data = struct.pack('!i', depth)
diff --git a/sphinx/util/pycompat.py b/sphinx/util/pycompat.py
index bbaf4e23..cd9f6e2f 100644
--- a/sphinx/util/pycompat.py
+++ b/sphinx/util/pycompat.py
@@ -13,11 +13,116 @@ import sys
import codecs
import encodings
-
-try:
+# ------------------------------------------------------------------------------
+# Python 2/3 compatibility
+
+if sys.version_info >= (3, 0):
+ # Python 3
+ class_types = (type,)
+ # the ubiquitous "bytes" helper functions
+ def b(s):
+ return s.encode('utf-8')
+ bytes = bytes
+ # prefix for Unicode strings
+ u = ''
+ # StringIO/BytesIO classes
+ from io import StringIO, BytesIO, TextIOWrapper
+ # safely encode a string for printing to the terminal
+ def terminal_safe(s):
+ return s.encode('ascii', 'backslashreplace').decode('ascii')
+ # support for running 2to3 over config files
+ def convert_with_2to3(filepath):
+ from lib2to3.refactor import RefactoringTool, get_fixers_from_package
+ from lib2to3.pgen2.parse import ParseError
+ fixers = get_fixers_from_package('lib2to3.fixes')
+ refactoring_tool = RefactoringTool(fixers)
+ source = refactoring_tool._read_python_source(filepath)[0]
+ try:
+ tree = refactoring_tool.refactor_string(source, 'conf.py')
+ except ParseError, err:
+ # do not propagate lib2to3 exceptions
+ lineno, offset = err.context[1]
+ # try to match ParseError details with SyntaxError details
+ raise SyntaxError(err.msg, (filepath, lineno, offset, err.value))
+ return unicode(tree)
+
+else:
+ # Python 2
+ from types import ClassType
+ class_types = (type, ClassType)
+ b = str
+ bytes = str
+ u = 'u'
+ from StringIO import StringIO
+ BytesIO = StringIO
+ # no need to refactor on 2.x versions
+ convert_with_2to3 = None
+ def TextIOWrapper(stream, encoding):
+ return codecs.lookup(encoding or 'ascii')[2](stream)
+ # safely encode a string for printing to the terminal
+ def terminal_safe(s):
+ return s.encode('ascii', 'backslashreplace')
+
+
+# ------------------------------------------------------------------------------
+# Missing builtins and itertools in Python < 2.6
+
+if sys.version_info >= (2, 6):
+ # Python >= 2.6
+ next = next
+
+ from itertools import product
+ try:
+ from itertools import zip_longest # Python 3 name
+ except ImportError:
+ from itertools import izip_longest as zip_longest
+
+else:
+ # Python < 2.6
+ from itertools import izip, repeat, chain
+
+ # this is on Python 2, where the method is called "next" (it is refactored
+ # to __next__ by 2to3, but in that case never executed)
+ def next(iterator):
+ return iterator.next()
+
+ # These replacement functions have been taken from the Python 2.6
+ # itertools documentation.
+ def product(*args, **kwargs):
+ pools = map(tuple, args) * kwargs.get('repeat', 1)
+ result = [[]]
+ for pool in pools:
+ result = [x + [y] for x in result for y in pool]
+ for prod in result:
+ yield tuple(prod)
+
+ def zip_longest(*args, **kwds):
+ # zip_longest('ABCD', 'xy', fillvalue='-') --> Ax By C- D-
+ fillvalue = kwds.get('fillvalue')
+ def sentinel(counter = ([fillvalue]*(len(args)-1)).pop):
+ yield counter() # yields the fillvalue, or raises IndexError
+ fillers = repeat(fillvalue)
+ iters = [chain(it, sentinel(), fillers) for it in args]
+ try:
+ for tup in izip(*iters):
+ yield tup
+ except IndexError:
+ pass
+
+
+# ------------------------------------------------------------------------------
+# Missing builtins and codecs in Python < 2.5
+
+if sys.version_info >= (2, 5):
+ # Python >= 2.5
+ base_exception = BaseException
any = any
all = all
-except NameError:
+
+else:
+ # Python 2.4
+ base_exception = Exception
+
def all(gen):
for i in gen:
if not i:
@@ -30,8 +135,6 @@ except NameError:
return True
return False
-
-if sys.version_info < (2, 5):
# Python 2.4 doesn't know the utf-8-sig encoding, so deliver it here
def my_search_function(encoding):
diff --git a/sphinx/util/texescape.py b/sphinx/util/texescape.py
index f968f2e4..1f6f76e6 100644
--- a/sphinx/util/texescape.py
+++ b/sphinx/util/texescape.py
@@ -100,9 +100,7 @@ tex_replacements = [
tex_escape_map = {}
tex_replace_map = {}
-tex_hl_escape_map_old = {} # replacement map for Pygments <= 1.1
-tex_hl_escape_map_new = {} # replacement map for Pygments >= 1.2
-_old_cmd_chars = {ord(u'\\'): u'@', ord(u'{'): u'[', ord(u'}'): u']'}
+tex_hl_escape_map_new = {}
def init():
for a, b in tex_replacements:
@@ -112,4 +110,3 @@ def init():
for a, b in tex_replacements:
if a in u'[]{}\\': continue
tex_hl_escape_map_new[ord(a)] = b
- tex_hl_escape_map_old[ord(a)] = b.translate(_old_cmd_chars)
diff --git a/sphinx/util/websupport.py b/sphinx/util/websupport.py
new file mode 100644
index 00000000..d9b47213
--- /dev/null
+++ b/sphinx/util/websupport.py
@@ -0,0 +1,12 @@
+# -*- coding: utf-8 -*-
+"""
+ sphinx.util.websupport
+ ~~~~~~~~~~~~~~~~~~~~~~
+
+ :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
+ :license: BSD, see LICENSE for details.
+"""
+
+def is_commentable(node):
+ #return node.__class__.__name__ in ('paragraph', 'literal_block')
+ return node.__class__.__name__ == 'paragraph'
diff --git a/sphinx/versioning.py b/sphinx/versioning.py
new file mode 100644
index 00000000..d45ed1d3
--- /dev/null
+++ b/sphinx/versioning.py
@@ -0,0 +1,127 @@
+# -*- coding: utf-8 -*-
+"""
+ sphinx.versioning
+ ~~~~~~~~~~~~~~~~~
+
+ Implements the low-level algorithms Sphinx uses for the versioning of
+ doctrees.
+
+ :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
+ :license: BSD, see LICENSE for details.
+"""
+from uuid import uuid4
+from operator import itemgetter
+
+from sphinx.util.pycompat import product, zip_longest, all
+
+
+# anything below that ratio is considered equal/changed
+VERSIONING_RATIO = 65
+
+
+def add_uids(doctree, condition):
+ """Add a unique id to every node in the `doctree` which matches the
+ condition and yield the nodes.
+
+ :param doctree:
+ A :class:`docutils.nodes.document` instance.
+
+ :param condition:
+ A callable which returns either ``True`` or ``False`` for a given node.
+ """
+ for node in doctree.traverse(condition):
+ node.uid = uuid4().hex
+ yield node
+
+
+def merge_doctrees(old, new, condition):
+ """Merge the `old` doctree with the `new` one while looking at nodes
+ matching the `condition`.
+
+ Each node which replaces another one or has been added to the `new` doctree
+ will be yielded.
+
+ :param condition:
+ A callable which returns either ``True`` or ``False`` for a given node.
+ """
+ old_iter = old.traverse(condition)
+ new_iter = new.traverse(condition)
+ old_nodes = []
+ new_nodes = []
+ ratios = {}
+ seen = set()
+ # compare the nodes each doctree in order
+ for old_node, new_node in zip_longest(old_iter, new_iter):
+ if old_node is None:
+ new_nodes.append(new_node)
+ continue
+ if new_node is None:
+ old_nodes.append(old_node)
+ continue
+ ratio = get_ratio(old_node.rawsource, new_node.rawsource)
+ if ratio == 0:
+ new_node.uid = old_node.uid
+ seen.add(new_node)
+ else:
+ ratios[old_node, new_node] = ratio
+ old_nodes.append(old_node)
+ new_nodes.append(new_node)
+ # calculate the ratios for each unequal pair of nodes, should we stumble
+ # on a pair which is equal we set the uid and add it to the seen ones
+ for old_node, new_node in product(old_nodes, new_nodes):
+ if new_node in seen or (old_node, new_node) in ratios:
+ continue
+ ratio = get_ratio(old_node.rawsource, new_node.rawsource)
+ if ratio == 0:
+ new_node.uid = old_node.uid
+ seen.add(new_node)
+ else:
+ ratios[old_node, new_node] = ratio
+ # choose the old node with the best ratio for each new node and set the uid
+ # as long as the ratio is under a certain value, in which case we consider
+ # them not changed but different
+ ratios = sorted(ratios.iteritems(), key=itemgetter(1))
+ for (old_node, new_node), ratio in ratios:
+ if new_node in seen:
+ continue
+ else:
+ seen.add(new_node)
+ if ratio < VERSIONING_RATIO:
+ new_node.uid = old_node.uid
+ else:
+ new_node.uid = uuid4().hex
+ yield new_node
+ # create new uuids for any new node we left out earlier, this happens
+ # if one or more nodes are simply added.
+ for new_node in set(new_nodes) - seen:
+ new_node.uid = uuid4().hex
+ yield new_node
+
+
+def get_ratio(old, new):
+ """Return a "similiarity ratio" (in percent) representing the similarity
+ between the two strings where 0 is equal and anything above less than equal.
+ """
+ if not all([old, new]):
+ return VERSIONING_RATIO
+ return levenshtein_distance(old, new) / (len(old) / 100.0)
+
+
+def levenshtein_distance(a, b):
+ """Return the Levenshtein edit distance between two strings *a* and *b*."""
+ if a == b:
+ return 0
+ if len(a) < len(b):
+ a, b = b, a
+ if not a:
+ return len(b)
+ previous_row = xrange(len(b) + 1)
+ for i, column1 in enumerate(a):
+ current_row = [i + 1]
+ for j, column2 in enumerate(b):
+ insertions = previous_row[j + 1] + 1
+ deletions = current_row[j] + 1
+ substitutions = previous_row[j] + (column1 != column2)
+ current_row.append(min(insertions, deletions, substitutions))
+ previous_row = current_row
+ return previous_row[-1]
diff --git a/sphinx/websupport/__init__.py b/sphinx/websupport/__init__.py
new file mode 100644
index 00000000..e054812e
--- /dev/null
+++ b/sphinx/websupport/__init__.py
@@ -0,0 +1,456 @@
+# -*- coding: utf-8 -*-
+"""
+ sphinx.websupport
+ ~~~~~~~~~~~~~~~~~
+
+ Base Module for web support functions.
+
+ :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
+ :license: BSD, see LICENSE for details.
+"""
+
+import cgi
+import sys
+import cPickle as pickle
+import posixpath
+from os import path
+
+from jinja2 import Environment, FileSystemLoader
+
+from docutils.core import publish_parts
+
+from sphinx.application import Sphinx
+from sphinx.util.osutil import ensuredir
+from sphinx.util.jsonimpl import dumps as dump_json
+from sphinx.websupport import errors
+from sphinx.websupport.search import BaseSearch, SEARCH_ADAPTERS
+from sphinx.websupport.storage import StorageBackend
+
+
+class WebSupport(object):
+ """The main API class for the web support package. All interactions
+ with the web support package should occur through this class.
+ """
+ def __init__(self,
+ srcdir=None, # only required for building
+ builddir='', # the dir with data/static/doctrees subdirs
+ datadir=None, # defaults to builddir/data
+ staticdir=None, # defaults to builddir/static
+ doctreedir=None, # defaults to builddir/doctrees
+ search=None, # defaults to no search
+ storage=None, # defaults to SQLite in datadir
+ status=sys.stdout,
+ warning=sys.stderr,
+ moderation_callback=None,
+ allow_anonymous_comments=True,
+ docroot='',
+ staticroot='static',
+ ):
+ # directories
+ self.srcdir = srcdir
+ self.builddir = builddir
+ self.outdir = path.join(builddir, 'data')
+ self.datadir = datadir or self.outdir
+ self.staticdir = staticdir or path.join(self.builddir, 'static')
+ self.doctreedir = staticdir or path.join(self.builddir, 'doctrees')
+ # web server virtual paths
+ self.staticroot = staticroot.strip('/')
+ self.docroot = docroot.strip('/')
+
+ self.status = status
+ self.warning = warning
+ self.moderation_callback = moderation_callback
+ self.allow_anonymous_comments = allow_anonymous_comments
+
+ self._init_templating()
+ self._init_search(search)
+ self._init_storage(storage)
+
+ self._globalcontext = None
+
+ self._make_base_comment_options()
+
+ def _init_storage(self, storage):
+ if isinstance(storage, StorageBackend):
+ self.storage = storage
+ else:
+ # If a StorageBackend isn't provided, use the default
+ # SQLAlchemy backend.
+ from sphinx.websupport.storage.sqlalchemystorage \
+ import SQLAlchemyStorage
+ if not storage:
+ # no explicit DB path given; create default sqlite database
+ db_path = path.join(self.datadir, 'db', 'websupport.db')
+ ensuredir(path.dirname(db_path))
+ storage = 'sqlite:///' + db_path
+ self.storage = SQLAlchemyStorage(storage)
+
+ def _init_templating(self):
+ import sphinx
+ template_path = path.join(path.dirname(sphinx.__file__),
+ 'themes', 'basic')
+ loader = FileSystemLoader(template_path)
+ self.template_env = Environment(loader=loader)
+
+ def _init_search(self, search):
+ if isinstance(search, BaseSearch):
+ self.search = search
+ else:
+ mod, cls = SEARCH_ADAPTERS[search or 'null']
+ mod = 'sphinx.websupport.search.' + mod
+ SearchClass = getattr(__import__(mod, None, None, [cls]), cls)
+ search_path = path.join(self.datadir, 'search')
+ self.search = SearchClass(search_path)
+ self.results_template = \
+ self.template_env.get_template('searchresults.html')
+
+ def build(self):
+ """Build the documentation. Places the data into the `outdir`
+ directory. Use it like this::
+
+ support = WebSupport(srcdir, builddir, search='xapian')
+ support.build()
+
+ This will read reStructured text files from `srcdir`. Then it will
+ build the pickles and search index, placing them into `builddir`.
+ It will also save node data to the database.
+ """
+ if not self.srcdir:
+ raise RuntimeError('No srcdir associated with WebSupport object')
+ app = Sphinx(self.srcdir, self.srcdir, self.outdir, self.doctreedir,
+ 'websupport', status=self.status, warning=self.warning)
+ app.builder.set_webinfo(self.staticdir, self.staticroot,
+ self.search, self.storage)
+
+ self.storage.pre_build()
+ app.build()
+ self.storage.post_build()
+
+ def get_globalcontext(self):
+ """Load and return the "global context" pickle."""
+ if not self._globalcontext:
+ infilename = path.join(self.datadir, 'globalcontext.pickle')
+ f = open(infilename, 'rb')
+ try:
+ self._globalcontext = pickle.load(f)
+ finally:
+ f.close()
+ return self._globalcontext
+
+ def get_document(self, docname, username='', moderator=False):
+ """Load and return a document from a pickle. The document will
+ be a dict object which can be used to render a template::
+
+ support = WebSupport(datadir=datadir)
+ support.get_document('index', username, moderator)
+
+ In most cases `docname` will be taken from the request path and
+ passed directly to this function. In Flask, that would be something
+ like this::
+
+ @app.route('/<path:docname>')
+ def index(docname):
+ username = g.user.name if g.user else ''
+ moderator = g.user.moderator if g.user else False
+ try:
+ document = support.get_document(docname, username,
+ moderator)
+ except DocumentNotFoundError:
+ abort(404)
+ render_template('doc.html', document=document)
+
+ The document dict that is returned contains the following items
+ to be used during template rendering.
+
+ * **body**: The main body of the document as HTML
+ * **sidebar**: The sidebar of the document as HTML
+ * **relbar**: A div containing links to related documents
+ * **title**: The title of the document
+ * **css**: Links to css files used by Sphinx
+ * **script**: Javascript containing comment options
+
+ This raises :class:`~sphinx.websupport.errors.DocumentNotFoundError`
+ if a document matching `docname` is not found.
+
+ :param docname: the name of the document to load.
+ """
+ docpath = path.join(self.datadir, 'pickles', docname)
+ if path.isdir(docpath):
+ infilename = docpath + '/index.fpickle'
+ if not docname:
+ docname = 'index'
+ else:
+ docname += '/index'
+ else:
+ infilename = docpath + '.fpickle'
+
+ try:
+ f = open(infilename, 'rb')
+ except IOError:
+ raise errors.DocumentNotFoundError(
+ 'The document "%s" could not be found' % docname)
+ try:
+ document = pickle.load(f)
+ finally:
+ f.close()
+
+ comment_opts = self._make_comment_options(username, moderator)
+ comment_meta = self._make_metadata(
+ self.storage.get_metadata(docname, moderator))
+
+ document['script'] = comment_opts + comment_meta + document['script']
+ return document
+
+ def get_search_results(self, q):
+ """Perform a search for the query `q`, and create a set
+ of search results. Then render the search results as html and
+ return a context dict like the one created by
+ :meth:`get_document`::
+
+ document = support.get_search_results(q)
+
+ :param q: the search query
+ """
+ results = self.search.query(q)
+ ctx = {
+ 'q': q,
+ 'search_performed': True,
+ 'search_results': results,
+ 'docroot': '../', # XXX
+ }
+ document = {
+ 'body': self.results_template.render(ctx),
+ 'title': 'Search Results',
+ 'sidebar': '',
+ 'relbar': ''
+ }
+ return document
+
+ def get_data(self, node_id, username=None, moderator=False):
+ """Get the comments and source associated with `node_id`. If
+ `username` is given vote information will be included with the
+ returned comments. The default CommentBackend returns a dict with
+ two keys, *source*, and *comments*. *source* is raw source of the
+ node and is used as the starting point for proposals a user can
+ add. *comments* is a list of dicts that represent a comment, each
+ having the following items:
+
+ ============= ======================================================
+ Key Contents
+ ============= ======================================================
+ text The comment text.
+ username The username that was stored with the comment.
+ id The comment's unique identifier.
+ rating The comment's current rating.
+ age The time in seconds since the comment was added.
+ time A dict containing time information. It contains the
+ following keys: year, month, day, hour, minute, second,
+ iso, and delta. `iso` is the time formatted in ISO
+ 8601 format. `delta` is a printable form of how old
+ the comment is (e.g. "3 hours ago").
+ vote If `user_id` was given, this will be an integer
+ representing the vote. 1 for an upvote, -1 for a
+ downvote, or 0 if unvoted.
+ node The id of the node that the comment is attached to.
+ If the comment's parent is another comment rather than
+ a node, this will be null.
+ parent The id of the comment that this comment is attached
+ to if it is not attached to a node.
+ children A list of all children, in this format.
+ proposal_diff An HTML representation of the differences between the
+ the current source and the user's proposed source.
+ ============= ======================================================
+
+ :param node_id: the id of the node to get comments for.
+ :param username: the username of the user viewing the comments.
+ :param moderator: whether the user is a moderator.
+ """
+ return self.storage.get_data(node_id, username, moderator)
+
+ def delete_comment(self, comment_id, username='', moderator=False):
+ """Delete a comment.
+
+ If `moderator` is True, the comment and all descendants will be deleted
+ from the database, and the function returns ``True``.
+
+ If `moderator` is False, the comment will be marked as deleted (but not
+ removed from the database so as not to leave any comments orphaned), but
+ only if the `username` matches the `username` on the comment. The
+ username and text files are replaced with "[deleted]" . In this case,
+ the function returns ``False``.
+
+ This raises :class:`~sphinx.websupport.errors.UserNotAuthorizedError`
+ if moderator is False and `username` doesn't match username on the
+ comment.
+
+ :param comment_id: the id of the comment to delete.
+ :param username: the username requesting the deletion.
+ :param moderator: whether the requestor is a moderator.
+ """
+ return self.storage.delete_comment(comment_id, username, moderator)
+
+ def add_comment(self, text, node_id='', parent_id='', displayed=True,
+ username=None, time=None, proposal=None,
+ moderator=False):
+ """Add a comment to a node or another comment. Returns the comment
+ in the same format as :meth:`get_comments`. If the comment is being
+ attached to a node, pass in the node's id (as a string) with the
+ node keyword argument::
+
+ comment = support.add_comment(text, node_id=node_id)
+
+ If the comment is the child of another comment, provide the parent's
+ id (as a string) with the parent keyword argument::
+
+ comment = support.add_comment(text, parent_id=parent_id)
+
+ If you would like to store a username with the comment, pass
+ in the optional `username` keyword argument::
+
+ comment = support.add_comment(text, node=node_id,
+ username=username)
+
+ :param parent_id: the prefixed id of the comment's parent.
+ :param text: the text of the comment.
+ :param displayed: for moderation purposes
+ :param username: the username of the user making the comment.
+ :param time: the time the comment was created, defaults to now.
+ """
+ if username is None:
+ if self.allow_anonymous_comments:
+ username = 'Anonymous'
+ else:
+ raise errors.UserNotAuthorizedError()
+ parsed = self._parse_comment_text(text)
+ comment = self.storage.add_comment(parsed, displayed, username,
+ time, proposal, node_id,
+ parent_id, moderator)
+ comment['original_text'] = text
+ if not displayed and self.moderation_callback:
+ self.moderation_callback(comment)
+ return comment
+
+ def process_vote(self, comment_id, username, value):
+ """Process a user's vote. The web support package relies
+ on the API user to perform authentication. The API user will
+ typically receive a comment_id and value from a form, and then
+ make sure the user is authenticated. A unique username must be
+ passed in, which will also be used to retrieve the user's past
+ voting data. An example, once again in Flask::
+
+ @app.route('/docs/process_vote', methods=['POST'])
+ def process_vote():
+ if g.user is None:
+ abort(401)
+ comment_id = request.form.get('comment_id')
+ value = request.form.get('value')
+ if value is None or comment_id is None:
+ abort(400)
+ support.process_vote(comment_id, g.user.name, value)
+ return "success"
+
+ :param comment_id: the comment being voted on
+ :param username: the unique username of the user voting
+ :param value: 1 for an upvote, -1 for a downvote, 0 for an unvote.
+ """
+ value = int(value)
+ if not -1 <= value <= 1:
+ raise ValueError('vote value %s out of range (-1, 1)' % value)
+ self.storage.process_vote(comment_id, username, value)
+
+ def update_username(self, old_username, new_username):
+ """To remain decoupled from a webapp's authentication system, the
+ web support package stores a user's username with each of their
+ comments and votes. If the authentication system allows a user to
+ change their username, this can lead to stagnate data in the web
+ support system. To avoid this, each time a username is changed, this
+ method should be called.
+
+ :param old_username: The original username.
+ :param new_username: The new username.
+ """
+ self.storage.update_username(old_username, new_username)
+
+ def accept_comment(self, comment_id, moderator=False):
+ """Accept a comment that is pending moderation.
+
+ This raises :class:`~sphinx.websupport.errors.UserNotAuthorizedError`
+ if moderator is False.
+
+ :param comment_id: The id of the comment that was accepted.
+ :param moderator: Whether the user making the request is a moderator.
+ """
+ if not moderator:
+ raise errors.UserNotAuthorizedError()
+ self.storage.accept_comment(comment_id)
+
+ def _make_base_comment_options(self):
+ """Helper method to create the part of the COMMENT_OPTIONS javascript
+ that remains the same throughout the lifetime of the
+ :class:`~sphinx.websupport.WebSupport` object.
+ """
+ self.base_comment_opts = {}
+
+ if self.docroot != '':
+ comment_urls = [
+ ('addCommentURL', '_add_comment'),
+ ('getCommentsURL', '_get_comments'),
+ ('processVoteURL', '_process_vote'),
+ ('acceptCommentURL', '_accept_comment'),
+ ('deleteCommentURL', '_delete_comment')
+ ]
+ for key, value in comment_urls:
+ self.base_comment_opts[key] = \
+ '/' + posixpath.join(self.docroot, value)
+ if self.staticroot != 'static':
+ static_urls = [
+ ('commentImage', 'comment.png'),
+ ('closeCommentImage', 'comment-close.png'),
+ ('loadingImage', 'ajax-loader.gif'),
+ ('commentBrightImage', 'comment-bright.png'),
+ ('upArrow', 'up.png'),
+ ('upArrowPressed', 'up-pressed.png'),
+ ('downArrow', 'down.png'),
+ ('downArrowPressed', 'down-pressed.png')
+ ]
+ for key, value in static_urls:
+ self.base_comment_opts[key] = \
+ '/' + posixpath.join(self.staticroot, '_static', value)
+
+ def _make_comment_options(self, username, moderator):
+ """Helper method to create the parts of the COMMENT_OPTIONS
+ javascript that are unique to each request.
+
+ :param username: The username of the user making the request.
+ :param moderator: Whether the user making the request is a moderator.
+ """
+ rv = self.base_comment_opts.copy()
+ if username:
+ rv.update({
+ 'voting': True,
+ 'username': username,
+ 'moderator': moderator,
+ })
+ return '''\
+ <script type="text/javascript">
+ var COMMENT_OPTIONS = %s;
+ </script>
+ ''' % dump_json(rv)
+
+ def _make_metadata(self, data):
+ return '''\
+ <script type="text/javascript">
+ var COMMENT_METADATA = %s;
+ </script>
+ ''' % dump_json(data)
+
+ def _parse_comment_text(self, text):
+ settings = {'file_insertion_enabled': False,
+ 'raw_enabled': False,
+ 'output_encoding': 'unicode'}
+ try:
+ ret = publish_parts(text, writer_name='html',
+ settings_overrides=settings)['fragment']
+ except Exception:
+ ret = cgi.escape(text)
+ return ret
diff --git a/sphinx/websupport/errors.py b/sphinx/websupport/errors.py
new file mode 100644
index 00000000..225b10c8
--- /dev/null
+++ b/sphinx/websupport/errors.py
@@ -0,0 +1,26 @@
+# -*- coding: utf-8 -*-
+"""
+ sphinx.websupport.errors
+ ~~~~~~~~~~~~~~~~~~~~~~~~
+
+ Contains Error classes for the web support package.
+
+ :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
+ :license: BSD, see LICENSE for details.
+"""
+
+
+class DocumentNotFoundError(Exception):
+ pass
+
+
+class UserNotAuthorizedError(Exception):
+ pass
+
+
+class CommentNotAllowedError(Exception):
+ pass
+
+
+class NullSearchException(Exception):
+ pass
diff --git a/sphinx/websupport/search/__init__.py b/sphinx/websupport/search/__init__.py
new file mode 100644
index 00000000..385c3fa9
--- /dev/null
+++ b/sphinx/websupport/search/__init__.py
@@ -0,0 +1,126 @@
+# -*- coding: utf-8 -*-
+"""
+ sphinx.websupport.search
+ ~~~~~~~~~~~~~~~~~~~~~~~~
+
+ Server side search support for the web support package.
+
+ :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
+ :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+
+class BaseSearch(object):
+ def __init__(self, path):
+ pass
+
+ def init_indexing(self, changed=[]):
+ """Called by the builder to initialize the search indexer. `changed`
+ is a list of pagenames that will be reindexed. You may want to remove
+ these from the search index before indexing begins.
+
+ :param changed: a list of pagenames that will be re-indexed
+ """
+ pass
+
+ def finish_indexing(self):
+ """Called by the builder when writing has been completed. Use this
+ to perform any finalization or cleanup actions after indexing is
+ complete.
+ """
+ pass
+
+ def feed(self, pagename, title, doctree):
+ """Called by the builder to add a doctree to the index. Converts the
+ `doctree` to text and passes it to :meth:`add_document`. You probably
+ won't want to override this unless you need access to the `doctree`.
+ Override :meth:`add_document` instead.
+
+ :param pagename: the name of the page to be indexed
+ :param title: the title of the page to be indexed
+ :param doctree: is the docutils doctree representation of the page
+ """
+ self.add_document(pagename, title, doctree.astext())
+
+ def add_document(self, pagename, title, text):
+ """Called by :meth:`feed` to add a document to the search index.
+ This method should should do everything necessary to add a single
+ document to the search index.
+
+ `pagename` is name of the page being indexed. It is the combination
+ of the source files relative path and filename,
+ minus the extension. For example, if the source file is
+ "ext/builders.rst", the `pagename` would be "ext/builders". This
+ will need to be returned with search results when processing a
+ query.
+
+ :param pagename: the name of the page being indexed
+ :param title: the page's title
+ :param text: the full text of the page
+ """
+ raise NotImplementedError()
+
+ def query(self, q):
+ """Called by the web support api to get search results. This method
+ compiles the regular expression to be used when :meth:`extracting
+ context <extract_context>`, then calls :meth:`handle_query`. You
+ won't want to override this unless you don't want to use the included
+ :meth:`extract_context` method. Override :meth:`handle_query` instead.
+
+ :param q: the search query string.
+ """
+ self.context_re = re.compile('|'.join(q.split()), re.I)
+ return self.handle_query(q)
+
+ def handle_query(self, q):
+ """Called by :meth:`query` to retrieve search results for a search
+ query `q`. This should return an iterable containing tuples of the
+ following format::
+
+ (<path>, <title>, <context>)
+
+ `path` and `title` are the same values that were passed to
+ :meth:`add_document`, and `context` should be a short text snippet
+ of the text surrounding the search query in the document.
+
+ The :meth:`extract_context` method is provided as a simple way
+ to create the `context`.
+
+ :param q: the search query
+ """
+ raise NotImplementedError()
+
+ def extract_context(self, text, length=240):
+ """Extract the context for the search query from the document's
+ full `text`.
+
+ :param text: the full text of the document to create the context for
+ :param length: the length of the context snippet to return.
+ """
+ res = self.context_re.search(text)
+ if res is None:
+ return ''
+ context_start = max(res.start() - length/2, 0)
+ context_end = context_start + length
+ context = ''.join([context_start > 0 and '...' or '',
+ text[context_start:context_end],
+ context_end < len(text) and '...' or ''])
+
+ try:
+ return unicode(context, errors='ignore')
+ except TypeError:
+ return context
+
+ def context_for_searchtool(self):
+ """Required by the HTML builder."""
+ return {}
+
+
+# The built-in search adapters.
+SEARCH_ADAPTERS = {
+ 'xapian': ('xapiansearch', 'XapianSearch'),
+ 'whoosh': ('whooshsearch', 'WhooshSearch'),
+ 'null': ('nullsearch', 'NullSearch'),
+}
diff --git a/sphinx/websupport/search/nullsearch.py b/sphinx/websupport/search/nullsearch.py
new file mode 100644
index 00000000..61f2d2fb
--- /dev/null
+++ b/sphinx/websupport/search/nullsearch.py
@@ -0,0 +1,24 @@
+# -*- coding: utf-8 -*-
+"""
+ sphinx.websupport.search.nullsearch
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ The default search adapter, does nothing.
+
+ :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
+ :license: BSD, see LICENSE for details.
+"""
+
+from sphinx.websupport.search import BaseSearch
+from sphinx.websupport.errors import NullSearchException
+
+
+class NullSearch(BaseSearch):
+ """A search adapter that does nothing. Used when no search adapter
+ is specified.
+ """
+ def feed(self, pagename, title, doctree):
+ pass
+
+ def query(self, q):
+ raise NullSearchException('No search adapter specified.')
diff --git a/sphinx/websupport/search/whooshsearch.py b/sphinx/websupport/search/whooshsearch.py
new file mode 100644
index 00000000..1ed3d714
--- /dev/null
+++ b/sphinx/websupport/search/whooshsearch.py
@@ -0,0 +1,59 @@
+# -*- coding: utf-8 -*-
+"""
+ sphinx.websupport.search.whooshsearch
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ Whoosh search adapter.
+
+ :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
+ :license: BSD, see LICENSE for details.
+"""
+
+from whoosh import index
+from whoosh.fields import Schema, ID, TEXT
+from whoosh.qparser import QueryParser
+from whoosh.analysis import StemmingAnalyzer
+
+from sphinx.util.osutil import ensuredir
+from sphinx.websupport.search import BaseSearch
+
+
+class WhooshSearch(BaseSearch):
+ """The whoosh search adapter for sphinx web support."""
+
+ # Define the Whoosh Schema for the search index.
+ schema = Schema(path=ID(stored=True, unique=True),
+ title=TEXT(field_boost=2.0, stored=True),
+ text=TEXT(analyzer=StemmingAnalyzer(), stored=True))
+
+ def __init__(self, db_path):
+ ensuredir(db_path)
+ if index.exists_in(db_path):
+ self.index = index.open_dir(db_path)
+ else:
+ self.index = index.create_in(db_path, schema=self.schema)
+ self.qparser = QueryParser('text', self.schema)
+
+ def init_indexing(self, changed=[]):
+ for changed_path in changed:
+ self.index.delete_by_term('path', changed_path)
+ self.index_writer = self.index.writer()
+
+ def finish_indexing(self):
+ self.index_writer.commit()
+
+ def add_document(self, pagename, title, text):
+ self.index_writer.add_document(path=unicode(pagename),
+ title=title,
+ text=text)
+
+ def handle_query(self, q):
+ searcher = self.index.searcher()
+ whoosh_results = searcher.search(self.qparser.parse(q))
+ results = []
+ for result in whoosh_results:
+ context = self.extract_context(result['text'])
+ results.append((result['path'],
+ result.get('title', ''),
+ context))
+ return results
diff --git a/sphinx/websupport/search/xapiansearch.py b/sphinx/websupport/search/xapiansearch.py
new file mode 100644
index 00000000..0615be84
--- /dev/null
+++ b/sphinx/websupport/search/xapiansearch.py
@@ -0,0 +1,81 @@
+# -*- coding: utf-8 -*-
+"""
+ sphinx.websupport.search.xapiansearch
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ Xapian search adapter.
+
+ :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
+ :license: BSD, see LICENSE for details.
+"""
+
+import xapian
+
+from sphinx.util.osutil import ensuredir
+from sphinx.websupport.search import BaseSearch
+
+
+class XapianSearch(BaseSearch):
+ # Adapted from the GSOC 2009 webapp project.
+
+ # Xapian metadata constants
+ DOC_PATH = 0
+ DOC_TITLE = 1
+
+ def __init__(self, db_path):
+ self.db_path = db_path
+
+ def init_indexing(self, changed=[]):
+ ensuredir(self.db_path)
+ self.database = xapian.WritableDatabase(self.db_path,
+ xapian.DB_CREATE_OR_OPEN)
+ self.indexer = xapian.TermGenerator()
+ stemmer = xapian.Stem("english")
+ self.indexer.set_stemmer(stemmer)
+
+ def finish_indexing(self):
+ # Ensure the db lock is removed.
+ del self.database
+
+ def add_document(self, path, title, text):
+ self.database.begin_transaction()
+ # sphinx_page_path is used to easily retrieve documents by path.
+ sphinx_page_path = '"sphinxpagepath%s"' % path.replace('/', '_')
+ # Delete the old document if it exists.
+ self.database.delete_document(sphinx_page_path)
+
+ doc = xapian.Document()
+ doc.set_data(text)
+ doc.add_value(self.DOC_PATH, path)
+ doc.add_value(self.DOC_TITLE, title)
+ self.indexer.set_document(doc)
+ self.indexer.index_text(text)
+ doc.add_term(sphinx_page_path)
+ for word in text.split():
+ doc.add_posting(word, 1)
+ self.database.add_document(doc)
+ self.database.commit_transaction()
+
+ def handle_query(self, q):
+ database = xapian.Database(self.db_path)
+ enquire = xapian.Enquire(database)
+ qp = xapian.QueryParser()
+ stemmer = xapian.Stem("english")
+ qp.set_stemmer(stemmer)
+ qp.set_database(database)
+ qp.set_stemming_strategy(xapian.QueryParser.STEM_SOME)
+ query = qp.parse_query(q)
+
+ # Find the top 100 results for the query.
+ enquire.set_query(query)
+ matches = enquire.get_mset(0, 100)
+
+ results = []
+
+ for m in matches:
+ context = self.extract_context(m.document.get_data())
+ results.append((m.document.get_value(self.DOC_PATH),
+ m.document.get_value(self.DOC_TITLE),
+ ''.join(context) ))
+
+ return results
diff --git a/sphinx/websupport/storage/__init__.py b/sphinx/websupport/storage/__init__.py
new file mode 100644
index 00000000..77292812
--- /dev/null
+++ b/sphinx/websupport/storage/__init__.py
@@ -0,0 +1,115 @@
+# -*- coding: utf-8 -*-
+"""
+ sphinx.websupport.storage
+ ~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ Storage for the websupport package.
+
+ :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
+ :license: BSD, see LICENSE for details.
+"""
+
+class StorageBackend(object):
+ def pre_build(self):
+ """Called immediately before the build process begins. Use this
+ to prepare the StorageBackend for the addition of nodes.
+ """
+ pass
+
+ def has_node(self, id):
+ """Check to see if a node exists.
+
+ :param id: the id to check for.
+ """
+ raise NotImplementedError()
+
+ def add_node(self, id, document, source):
+ """Add a node to the StorageBackend.
+
+ :param id: a unique id for the comment.
+ :param document: the name of the document the node belongs to.
+ :param source: the source files name.
+ """
+ raise NotImplementedError()
+
+ def post_build(self):
+ """Called after a build has completed. Use this to finalize the
+ addition of nodes if needed.
+ """
+ pass
+
+ def add_comment(self, text, displayed, username, time,
+ proposal, node_id, parent_id, moderator):
+ """Called when a comment is being added.
+
+ :param text: the text of the comment
+ :param displayed: whether the comment should be displayed
+ :param username: the name of the user adding the comment
+ :param time: a date object with the time the comment was added
+ :param proposal: the text of the proposal the user made
+ :param node_id: the id of the node that the comment is being added to
+ :param parent_id: the id of the comment's parent comment.
+ :param moderator: whether the user adding the comment is a moderator
+ """
+ raise NotImplementedError()
+
+ def delete_comment(self, comment_id, username, moderator):
+ """Delete a comment.
+
+ Raises :class:`~sphinx.websupport.errors.UserNotAuthorizedError`
+ if moderator is False and `username` doesn't match the username
+ on the comment.
+
+ :param comment_id: The id of the comment being deleted.
+ :param username: The username of the user requesting the deletion.
+ :param moderator: Whether the user is a moderator.
+ """
+ raise NotImplementedError()
+
+ def get_metadata(self, docname, moderator):
+ """Get metadata for a document. This is currently just a dict
+ of node_id's with associated comment counts.
+
+ :param docname: the name of the document to get metadata for.
+ :param moderator: whether the requester is a moderator.
+ """
+ raise NotImplementedError()
+
+ def get_data(self, node_id, username, moderator):
+ """Called to retrieve all data for a node. This should return a
+ dict with two keys, *source* and *comments* as described by
+ :class:`~sphinx.websupport.WebSupport`'s
+ :meth:`~sphinx.websupport.WebSupport.get_data` method.
+
+ :param node_id: The id of the node to get data for.
+ :param username: The name of the user requesting the data.
+ :param moderator: Whether the requestor is a moderator.
+ """
+ raise NotImplementedError()
+
+ def process_vote(self, comment_id, username, value):
+ """Process a vote that is being cast. `value` will be either -1, 0,
+ or 1.
+
+ :param comment_id: The id of the comment being voted on.
+ :param username: The username of the user casting the vote.
+ :param value: The value of the vote being cast.
+ """
+ raise NotImplementedError()
+
+ def update_username(self, old_username, new_username):
+ """If a user is allowed to change their username this method should
+ be called so that there is not stagnate data in the storage system.
+
+ :param old_username: The username being changed.
+ :param new_username: What the username is being changed to.
+ """
+ raise NotImplementedError()
+
+ def accept_comment(self, comment_id):
+ """Called when a moderator accepts a comment. After the method is
+ called the comment should be displayed to all users.
+
+ :param comment_id: The id of the comment being accepted.
+ """
+ raise NotImplementedError()
diff --git a/sphinx/websupport/storage/differ.py b/sphinx/websupport/storage/differ.py
new file mode 100644
index 00000000..33fe54f3
--- /dev/null
+++ b/sphinx/websupport/storage/differ.py
@@ -0,0 +1,85 @@
+# -*- coding: utf-8 -*-
+"""
+ sphinx.websupport.storage.differ
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ A differ for creating an HTML representations of proposal diffs
+
+ :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
+ :license: BSD, see LICENSE for details.
+"""
+
+import re
+from cgi import escape
+from difflib import Differ
+
+
+class CombinedHtmlDiff(object):
+ """Create an HTML representation of the differences between two pieces
+ of text.
+ """
+ highlight_regex = re.compile(r'([\+\-\^]+)')
+
+ def __init__(self, source, proposal):
+ proposal = escape(proposal)
+
+ differ = Differ()
+ self.diff = list(differ.compare(source.splitlines(1),
+ proposal.splitlines(1)))
+
+ def make_text(self):
+ return '\n'.join(self.diff)
+
+ def make_html(self):
+ """Return the HTML representation of the differences between
+ `source` and `proposal`.
+
+ :param source: the original text
+ :param proposal: the proposed text
+ """
+ html = []
+ diff = self.diff[:]
+ line = diff.pop(0)
+ next = diff.pop(0)
+ while True:
+ html.append(self._handle_line(line, next))
+ line = next
+ try:
+ next = diff.pop(0)
+ except IndexError:
+ html.append(self._handle_line(line))
+ break
+ return ''.join(html).rstrip()
+
+ def _handle_line(self, line, next=None):
+ """Handle an individual line in a diff."""
+ prefix = line[0]
+ text = line[2:]
+
+ if prefix == ' ':
+ return text
+ elif prefix == '?':
+ return ''
+
+ if next is not None and next[0] == '?':
+ tag = prefix == '+' and 'ins' or 'del'
+ text = self._highlight_text(text, next, tag)
+ css_class = prefix == '+' and 'prop-added' or 'prop-removed'
+
+ return '<span class="%s">%s</span>\n' % (css_class, text.rstrip())
+
+ def _highlight_text(self, text, next, tag):
+ """Highlight the specific changes made to a line by adding
+ <ins> and <del> tags.
+ """
+ next = next[2:]
+ new_text = []
+ start = 0
+ for match in self.highlight_regex.finditer(next):
+ new_text.append(text[start:match.start()])
+ new_text.append('<%s>' % tag)
+ new_text.append(text[match.start():match.end()])
+ new_text.append('</%s>' % tag)
+ start = match.end()
+ new_text.append(text[start:])
+ return ''.join(new_text)
diff --git a/sphinx/websupport/storage/sqlalchemy_db.py b/sphinx/websupport/storage/sqlalchemy_db.py
new file mode 100644
index 00000000..dc2ec6a7
--- /dev/null
+++ b/sphinx/websupport/storage/sqlalchemy_db.py
@@ -0,0 +1,208 @@
+# -*- coding: utf-8 -*-
+"""
+ sphinx.websupport.storage.sqlalchemy_db
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ SQLAlchemy table and mapper definitions used by the
+ :class:`sphinx.websupport.storage.sqlalchemystorage.SQLAlchemyStorage`.
+
+ :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
+ :license: BSD, see LICENSE for details.
+"""
+
+from datetime import datetime
+
+from sqlalchemy import Column, Integer, Text, String, Boolean, \
+ ForeignKey, DateTime
+from sqlalchemy.orm import relation, sessionmaker, aliased
+from sqlalchemy.ext.declarative import declarative_base
+
+Base = declarative_base()
+Session = sessionmaker()
+
+db_prefix = 'sphinx_'
+
+
+class Node(Base):
+ """Data about a Node in a doctree."""
+ __tablename__ = db_prefix + 'nodes'
+
+ id = Column(String(32), primary_key=True)
+ document = Column(String(256), nullable=False)
+ source = Column(Text, nullable=False)
+
+ def nested_comments(self, username, moderator):
+ """Create a tree of comments. First get all comments that are
+ descendants of this node, then convert them to a tree form.
+
+ :param username: the name of the user to get comments for.
+ :param moderator: whether the user is moderator.
+ """
+ session = Session()
+
+ if username:
+ # If a username is provided, create a subquery to retrieve all
+ # votes by this user. We will outerjoin with the comment query
+ # with this subquery so we have a user's voting information.
+ sq = session.query(CommentVote).\
+ filter(CommentVote.username == username).subquery()
+ cvalias = aliased(CommentVote, sq)
+ q = session.query(Comment, cvalias.value).outerjoin(cvalias)
+ else:
+ # If a username is not provided, we don't need to join with
+ # CommentVote.
+ q = session.query(Comment)
+
+ # Filter out all comments not descending from this node.
+ q = q.filter(Comment.path.like(str(self.id) + '.%'))
+
+ # Filter out all comments that are not moderated yet.
+ if not moderator:
+ q = q.filter(Comment.displayed == True)
+
+ # Retrieve all results. Results must be ordered by Comment.path
+ # so that we can easily transform them from a flat list to a tree.
+ results = q.order_by(Comment.path).all()
+ session.close()
+
+ return self._nest_comments(results, username)
+
+ def _nest_comments(self, results, username):
+ """Given the flat list of results, convert the list into a
+ tree.
+
+ :param results: the flat list of comments
+ :param username: the name of the user requesting the comments.
+ """
+ comments = []
+ list_stack = [comments]
+ for r in results:
+ comment, vote = r if username else (r, 0)
+
+ inheritance_chain = comment.path.split('.')[1:]
+
+ if len(inheritance_chain) == len(list_stack) + 1:
+ parent = list_stack[-1][-1]
+ list_stack.append(parent['children'])
+ elif len(inheritance_chain) < len(list_stack):
+ while len(inheritance_chain) < len(list_stack):
+ list_stack.pop()
+
+ list_stack[-1].append(comment.serializable(vote=vote))
+
+ return comments
+
+ def __init__(self, id, document, source):
+ self.id = id
+ self.document = document
+ self.source = source
+
+
+class CommentVote(Base):
+ """A vote a user has made on a Comment."""
+ __tablename__ = db_prefix + 'commentvote'
+
+ username = Column(String(64), primary_key=True)
+ comment_id = Column(Integer, ForeignKey(db_prefix + 'comments.id'),
+ primary_key=True)
+ # -1 if downvoted, +1 if upvoted, 0 if voted then unvoted.
+ value = Column(Integer, nullable=False)
+
+ def __init__(self, comment_id, username, value):
+ self.comment_id = comment_id
+ self.username = username
+ self.value = value
+
+
+class Comment(Base):
+ """An individual Comment being stored."""
+ __tablename__ = db_prefix + 'comments'
+
+ id = Column(Integer, primary_key=True)
+ rating = Column(Integer, nullable=False)
+ time = Column(DateTime, nullable=False)
+ text = Column(Text, nullable=False)
+ displayed = Column(Boolean, index=True, default=False)
+ username = Column(String(64))
+ proposal = Column(Text)
+ proposal_diff = Column(Text)
+ path = Column(String(256), index=True)
+
+ node_id = Column(String, ForeignKey(db_prefix + 'nodes.id'))
+ node = relation(Node, backref="comments")
+
+ votes = relation(CommentVote, backref="comment",
+ cascade="all")
+
+ def __init__(self, text, displayed, username, rating, time,
+ proposal, proposal_diff):
+ self.text = text
+ self.displayed = displayed
+ self.username = username
+ self.rating = rating
+ self.time = time
+ self.proposal = proposal
+ self.proposal_diff = proposal_diff
+
+ def set_path(self, node_id, parent_id):
+ """Set the materialized path for this comment."""
+ # This exists because the path can't be set until the session has
+ # been flushed and this Comment has an id.
+ if node_id:
+ self.node_id = node_id
+ self.path = '%s.%s' % (node_id, self.id)
+ else:
+ session = Session()
+ parent_path = session.query(Comment.path).\
+ filter(Comment.id == parent_id).one().path
+ session.close()
+ self.node_id = parent_path.split('.')[0]
+ self.path = '%s.%s' % (parent_path, self.id)
+
+ def serializable(self, vote=0):
+ """Creates a serializable representation of the comment. This is
+ converted to JSON, and used on the client side.
+ """
+ delta = datetime.now() - self.time
+
+ time = {'year': self.time.year,
+ 'month': self.time.month,
+ 'day': self.time.day,
+ 'hour': self.time.hour,
+ 'minute': self.time.minute,
+ 'second': self.time.second,
+ 'iso': self.time.isoformat(),
+ 'delta': self.pretty_delta(delta)}
+
+ path = self.path.split('.')
+ node = path[0]
+ parent = path[-2] if len(path) > 2 else None
+
+ return {'text': self.text,
+ 'username': self.username or 'Anonymous',
+ 'id': self.id,
+ 'node': node,
+ 'parent': parent,
+ 'rating': self.rating,
+ 'displayed': self.displayed,
+ 'age': delta.seconds,
+ 'time': time,
+ 'vote': vote or 0,
+ 'proposal_diff': self.proposal_diff,
+ 'children': []}
+
+ def pretty_delta(self, delta):
+ """Create a pretty representation of the Comment's age.
+ (e.g. 2 minutes).
+ """
+ days = delta.days
+ seconds = delta.seconds
+ hours = seconds / 3600
+ minutes = seconds / 60
+
+ if days == 0:
+ dt = (minutes, 'minute') if hours == 0 else (hours, 'hour')
+ else:
+ dt = (days, 'day')
+
+ return '%s %s ago' % dt if dt[0] == 1 else '%s %ss ago' % dt
diff --git a/sphinx/websupport/storage/sqlalchemystorage.py b/sphinx/websupport/storage/sqlalchemystorage.py
new file mode 100644
index 00000000..e6eccfe9
--- /dev/null
+++ b/sphinx/websupport/storage/sqlalchemystorage.py
@@ -0,0 +1,177 @@
+# -*- coding: utf-8 -*-
+"""
+ sphinx.websupport.storage.sqlalchemystorage
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ An SQLAlchemy storage backend.
+
+ :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
+ :license: BSD, see LICENSE for details.
+"""
+
+from datetime import datetime
+
+import sqlalchemy
+from sqlalchemy.orm import aliased
+from sqlalchemy.sql import func
+
+if sqlalchemy.__version__[:3] < '0.5':
+ raise ImportError('SQLAlchemy version 0.5 or greater is required for this '
+ 'storage backend; you have version %s' % sqlalchemy.__version__)
+
+from sphinx.websupport.errors import CommentNotAllowedError, \
+ UserNotAuthorizedError
+from sphinx.websupport.storage import StorageBackend
+from sphinx.websupport.storage.sqlalchemy_db import Base, Node, \
+ Comment, CommentVote, Session
+from sphinx.websupport.storage.differ import CombinedHtmlDiff
+
+
+class SQLAlchemyStorage(StorageBackend):
+ """
+ A :class:`.StorageBackend` using SQLAlchemy.
+ """
+
+ def __init__(self, uri):
+ self.engine = sqlalchemy.create_engine(uri)
+ Base.metadata.bind = self.engine
+ Base.metadata.create_all()
+ Session.configure(bind=self.engine)
+
+ def pre_build(self):
+ self.build_session = Session()
+
+ def has_node(self, id):
+ session = Session()
+ node = session.query(Node).filter(Node.id == id).first()
+ session.close()
+ return bool(node)
+
+ def add_node(self, id, document, source):
+ node = Node(id, document, source)
+ self.build_session.add(node)
+ self.build_session.flush()
+
+ def post_build(self):
+ self.build_session.commit()
+ self.build_session.close()
+
+ def add_comment(self, text, displayed, username, time,
+ proposal, node_id, parent_id, moderator):
+ session = Session()
+ proposal_diff = None
+ proposal_diff_text = None
+
+ if node_id and proposal:
+ node = session.query(Node).filter(Node.id == node_id).one()
+ differ = CombinedHtmlDiff(node.source, proposal)
+ proposal_diff = differ.make_html()
+ proposal_diff_text = differ.make_text()
+ elif parent_id:
+ parent = session.query(Comment.displayed).\
+ filter(Comment.id == parent_id).one()
+ if not parent.displayed:
+ raise CommentNotAllowedError(
+ "Can't add child to a parent that is not displayed")
+
+ comment = Comment(text, displayed, username, 0,
+ time or datetime.now(), proposal, proposal_diff)
+ session.add(comment)
+ session.flush()
+ # We have to flush the session before setting the path so the
+ # Comment has an id.
+ comment.set_path(node_id, parent_id)
+ session.commit()
+ d = comment.serializable()
+ d['document'] = comment.node.document
+ d['proposal_diff_text'] = proposal_diff_text
+ session.close()
+ return d
+
+ def delete_comment(self, comment_id, username, moderator):
+ session = Session()
+ comment = session.query(Comment).\
+ filter(Comment.id == comment_id).one()
+ if moderator:
+ # moderator mode: delete the comment and all descendants
+ # find descendants via path
+ session.query(Comment).filter(
+ Comment.path.like(comment.path + '.%')).delete(False)
+ session.delete(comment)
+ session.commit()
+ session.close()
+ return True
+ elif comment.username == username:
+ # user mode: do not really delete, but remove text and proposal
+ comment.username = '[deleted]'
+ comment.text = '[deleted]'
+ comment.proposal = ''
+ session.commit()
+ session.close()
+ return False
+ else:
+ session.close()
+ raise UserNotAuthorizedError()
+
+ def get_metadata(self, docname, moderator):
+ session = Session()
+ subquery = session.query(
+ Comment.id, Comment.node_id,
+ func.count('*').label('comment_count')).group_by(
+ Comment.node_id).subquery()
+ nodes = session.query(Node.id, subquery.c.comment_count).outerjoin(
+ (subquery, Node.id==subquery.c.node_id)).filter(
+ Node.document==docname)
+ session.close()
+ session.commit()
+ return dict([(k, v or 0) for k, v in nodes])
+
+ def get_data(self, node_id, username, moderator):
+ session = Session()
+ node = session.query(Node).filter(Node.id == node_id).one()
+ session.close()
+ comments = node.nested_comments(username, moderator)
+ return {'source': node.source,
+ 'comments': comments}
+
+ def process_vote(self, comment_id, username, value):
+ session = Session()
+
+ subquery = session.query(CommentVote).filter(
+ CommentVote.username == username).subquery()
+ vote_alias = aliased(CommentVote, subquery)
+ q = session.query(Comment, vote_alias).outerjoin(vote_alias).filter(
+ Comment.id == comment_id)
+ comment, vote = q.one()
+
+ if vote is None:
+ vote = CommentVote(comment_id, username, value)
+ comment.rating += value
+ else:
+ comment.rating += value - vote.value
+ vote.value = value
+
+ session.add(vote)
+ session.commit()
+ session.close()
+
+ def update_username(self, old_username, new_username):
+ session = Session()
+
+ session.query(Comment).filter(Comment.username == old_username).\
+ update({Comment.username: new_username})
+ session.query(CommentVote).\
+ filter(CommentVote.username == old_username).\
+ update({CommentVote.username: new_username})
+
+ session.commit()
+ session.close()
+
+ def accept_comment(self, comment_id):
+ session = Session()
+ session.query(Comment).filter(Comment.id == comment_id).update(
+ {Comment.displayed: True}
+ )
+
+ session.commit()
+ session.close()
diff --git a/sphinx/writers/html.py b/sphinx/writers/html.py
index f8770264..787b3105 100644
--- a/sphinx/writers/html.py
+++ b/sphinx/writers/html.py
@@ -59,7 +59,11 @@ class HTMLTranslator(BaseTranslator):
self.highlightlang = builder.config.highlight_language
self.highlightlinenothreshold = sys.maxint
self.protect_literal_text = 0
- self.add_permalinks = builder.config.html_add_permalinks
+ self.permalink_text = builder.config.html_add_permalinks
+ # support backwards-compatible setting to a bool
+ if not isinstance(self.permalink_text, basestring):
+ self.permalink_text = self.permalink_text and u'\u00B6' or ''
+ self.permalink_text = self.encode(self.permalink_text)
self.secnumber_suffix = builder.config.html_secnumber_suffix
def visit_start_of_file(self, node):
@@ -81,11 +85,12 @@ class HTMLTranslator(BaseTranslator):
and node['ids'] and node['first']:
self.body.append('<!--[%s]-->' % node['ids'][0])
def depart_desc_signature(self, node):
- if node['ids'] and self.add_permalinks and self.builder.add_permalinks:
+ if node['ids'] and self.permalink_text and self.builder.add_permalinks:
self.body.append(u'<a class="headerlink" href="#%s" '
% node['ids'][0] +
- u'title="%s">\u00B6</a>' %
- _('Permalink to this definition'))
+ u'title="%s">%s</a>' % (
+ _('Permalink to this definition'),
+ self.permalink_text))
self.body.append('</dt>\n')
def visit_desc_addname(self, node):
@@ -181,7 +186,7 @@ class HTMLTranslator(BaseTranslator):
atts['title'] = node['reftitle']
self.body.append(self.starttag(node, 'a', '', **atts))
- if node.hasattr('secnumber'):
+ if node.get('secnumber'):
self.body.append(('%s' + self.secnumber_suffix) %
'.'.join(map(str, node['secnumber'])))
@@ -203,14 +208,14 @@ class HTMLTranslator(BaseTranslator):
self.depart_admonition(node)
def add_secnumber(self, node):
- if node.hasattr('secnumber'):
+ if node.get('secnumber'):
self.body.append('.'.join(map(str, node['secnumber'])) +
self.secnumber_suffix)
elif isinstance(node.parent, nodes.section):
anchorname = '#' + node.parent['ids'][0]
if anchorname not in self.builder.secnumbers:
anchorname = '' # try first heading which has no anchor
- if anchorname in self.builder.secnumbers:
+ if self.builder.secnumbers.get(anchorname):
numbers = self.builder.secnumbers[anchorname]
self.body.append('.'.join(map(str, numbers)) +
self.secnumber_suffix)
@@ -233,10 +238,12 @@ class HTMLTranslator(BaseTranslator):
lang = node['language']
if node.has_key('linenos'):
linenos = node['linenos']
+ highlight_args = node.get('highlight_args', {})
def warner(msg):
self.builder.warn(msg, (self.builder.current_docname, node.line))
highlighted = self.highlighter.highlight_block(
- node.rawsource, lang, linenos, warn=warner)
+ node.rawsource, lang, warn=warner, linenos=linenos,
+ **highlight_args)
starttag = self.starttag(node, 'div', suffix='',
CLASS='highlight-%s' % lang)
self.body.append(starttag + highlighted + '</div>\n')
@@ -253,9 +260,6 @@ class HTMLTranslator(BaseTranslator):
# overwritten
def visit_literal(self, node):
- if len(node.children) == 1 and \
- node.children[0] in ('None', 'True', 'False'):
- node['classes'].append('xref')
self.body.append(self.starttag(node, 'tt', '',
CLASS='docutils literal'))
self.protect_literal_text += 1
@@ -334,22 +338,20 @@ class HTMLTranslator(BaseTranslator):
if node['uri'].lower().endswith('svg') or \
node['uri'].lower().endswith('svgz'):
- atts = {'data': node['uri'], 'type': 'image/svg+xml'}
+ atts = {'src': node['uri']}
if node.has_key('width'):
atts['width'] = node['width']
if node.has_key('height'):
atts['height'] = node['height']
+ if node.has_key('alt'):
+ atts['alt'] = node['alt']
if node.has_key('align'):
self.body.append('<div align="%s" class="align-%s">' %
(node['align'], node['align']))
self.context.append('</div>\n')
else:
self.context.append('')
- embatts = atts.copy()
- embatts['src'] = embatts.pop('data')
- self.body.append(self.starttag(node, 'object', '', **atts))
- self.body.append(self.emptytag(node, 'embed', '', **embatts))
- self.body.append('</object>\n')
+ self.body.append(self.emptytag(node, 'img', '', **atts))
return
if node.has_key('scale'):
@@ -426,8 +428,6 @@ class HTMLTranslator(BaseTranslator):
encoded = self.bulk_text_processor(encoded)
self.body.append(encoded)
- # these are all for docutils 0.5 compatibility
-
def visit_note(self, node):
self.visit_admonition(node, 'note')
def depart_note(self, node):
@@ -488,24 +488,57 @@ class HTMLTranslator(BaseTranslator):
def depart_abbreviation(self, node):
self.body.append('</abbr>')
+ def visit_termsep(self, node):
+ self.body.append('<br />')
+ raise nodes.SkipNode
+
def depart_title(self, node):
close_tag = self.context[-1]
- if (self.add_permalinks and self.builder.add_permalinks and
+ if (self.permalink_text and self.builder.add_permalinks and
node.parent.hasattr('ids') and node.parent['ids']):
aname = node.parent['ids'][0]
# add permalink anchor
if close_tag.startswith('</h'):
self.body.append(u'<a class="headerlink" href="#%s" ' % aname +
- u'title="%s">\u00B6</a>' %
- _('Permalink to this headline'))
+ u'title="%s">%s</a>' % (
+ _('Permalink to this headline'),
+ self.permalink_text))
elif close_tag.startswith('</a></h'):
self.body.append(u'</a><a class="headerlink" href="#%s" ' %
aname +
- u'title="%s">\u00B6' %
- _('Permalink to this headline'))
+ u'title="%s">%s' % (
+ _('Permalink to this headline'),
+ self.permalink_text))
BaseTranslator.depart_title(self, node)
+ # overwritten to add even/odd classes
+
+ def visit_table(self, node):
+ self._table_row_index = 0
+ return BaseTranslator.visit_table(self, node)
+
+ def visit_row(self, node):
+ self._table_row_index += 1
+ if self._table_row_index % 2 == 0:
+ node['classes'].append('row-even')
+ else:
+ node['classes'].append('row-odd')
+ self.body.append(self.starttag(node, 'tr', ''))
+ node.column = 0
+
+ def visit_field_list(self, node):
+ self._fieldlist_row_index = 0
+ return BaseTranslator.visit_field_list(self, node)
+
+ def visit_field(self, node):
+ self._fieldlist_row_index += 1
+ if self._fieldlist_row_index % 2 == 0:
+ node['classes'].append('field-even')
+ else:
+ node['classes'].append('field-odd')
+ self.body.append(self.starttag(node, 'tr', '', CLASS='field'))
+
def unknown_visit(self, node):
raise NotImplementedError('Unknown node: ' + node.__class__.__name__)
diff --git a/sphinx/writers/latex.py b/sphinx/writers/latex.py
index d282d2c9..75d6e8ec 100644
--- a/sphinx/writers/latex.py
+++ b/sphinx/writers/latex.py
@@ -23,6 +23,7 @@ from sphinx import addnodes
from sphinx import highlighting
from sphinx.errors import SphinxError
from sphinx.locale import admonitionlabels, versionlabels, _
+from sphinx.util import split_into
from sphinx.util.osutil import ustrftime
from sphinx.util.pycompat import any
from sphinx.util.texescape import tex_escape_map, tex_replace_map
@@ -39,6 +40,7 @@ HEADER = r'''%% Generated by Sphinx.
%(fncychap)s
%(longtable)s
\usepackage{sphinx}
+\usepackage{multirow}
%(preamble)s
\title{%(title)s}
@@ -194,19 +196,21 @@ class LaTeXTranslator(nodes.NodeVisitor):
lang = babel.get_language()
if lang:
self.elements['classoptions'] += ',' + babel.get_language()
- elif builder.config.language == 'ja':
- self.elements['classoptions'] += ',dvipdfm'
- # not elements of babel, but this should be above sphinx.sty.
- # because pTeX (Japanese TeX) cannot handle this count.
- self.elements['babel'] = r'\newcount\pdfoutput\pdfoutput=0'
- # to make the pdf with correct encoded hyperref bookmarks
- self.elements['preamble'] += \
- r'\AtBeginDvi{\special{pdf:tounicode EUC-UCS2}}'
else:
self.builder.warn('no Babel option known for language %r' %
builder.config.language)
self.elements['shorthandoff'] = babel.get_shorthandoff()
self.elements['fncychap'] = '\\usepackage[Sonny]{fncychap}'
+
+ # pTeX (Japanese TeX) for support
+ if builder.config.language == 'ja':
+ self.elements['classoptions'] = ',dvipdfm'
+ # found elements of babel, but this should be above sphinx.sty.
+ # because pTeX (Japanese TeX) cannot handle this count.
+ self.elements['babel'] = r'\newcount\pdfoutput\pdfoutput=0'
+ # to make the pdf with correct encoded hyperref bookmarks
+ self.elements['preamble'] += \
+ r'\AtBeginDvi{\special{pdf:tounicode EUC-UCS2}}'
else:
self.elements['classoptions'] += ',english'
# allow the user to override them all
@@ -250,6 +254,9 @@ class LaTeXTranslator(nodes.NodeVisitor):
self.no_contractions = 0
self.compact_list = 0
self.first_param = 0
+ self.previous_spanning_row = 0
+ self.previous_spanning_column = 0
+ self.remember_multirow = {}
def astext(self):
return (HEADER % self.elements +
@@ -331,7 +338,7 @@ class LaTeXTranslator(nodes.NodeVisitor):
# ... and all others are the appendices
self.body.append(u'\n\\appendix\n')
self.first_document = -1
- if node.has_key('docname'):
+ if 'docname' in node:
self.body.append(self.hypertarget(':doc'))
# "- 1" because the level is increased before the title is visited
self.sectionlevel = self.top_sectionlevel - 1
@@ -624,6 +631,7 @@ class LaTeXTranslator(nodes.NodeVisitor):
self.table = Table()
self.table.longtable = 'longtable' in node['classes']
self.tablebody = []
+ self.tableheaders = []
# Redirect body output until table is finished.
self._body = self.body
self.body = self.tablebody
@@ -668,11 +676,13 @@ class LaTeXTranslator(nodes.NodeVisitor):
self.next_table_ids.clear()
if self.table.longtable:
self.body.append('\\hline\n')
+ self.body.extend(self.tableheaders)
self.body.append('\\endfirsthead\n\n')
self.body.append('\\multicolumn{%s}{c}%%\n' % self.table.colcount)
self.body.append(r'{{\bfseries \tablename\ \thetable{} -- %s}} \\'
% _('continued from previous page'))
self.body.append('\n\\hline\n')
+ self.body.extend(self.tableheaders)
self.body.append('\\endhead\n\n')
self.body.append(ur'\hline \multicolumn{%s}{|r|}{{%s}} \\ \hline'
% (self.table.colcount,
@@ -682,6 +692,7 @@ class LaTeXTranslator(nodes.NodeVisitor):
self.body.append('\\endlastfoot\n\n')
else:
self.body.append('\\hline\n')
+ self.body.extend(self.tableheaders)
self.body.extend(self.tablebody)
self.body.append(endmacro)
if not self.table.longtable and self.table.caption is not None:
@@ -700,39 +711,60 @@ class LaTeXTranslator(nodes.NodeVisitor):
pass
def visit_thead(self, node):
+ self.table.had_head = True
if self.next_table_colspec:
self.table.colspec = '{%s}\n' % self.next_table_colspec
self.next_table_colspec = None
-# self.body.append('\\hline\n')
-# self.table.had_head = True
+ # Redirect head output until header is finished. see visit_tbody.
+ self.body = self.tableheaders
def depart_thead(self, node):
- self.body.append('\\hline\n')
+ pass
def visit_tbody(self, node):
if not self.table.had_head:
self.visit_thead(node)
+ self.body = self.tablebody
def depart_tbody(self, node):
- self.body.append('\\hline\n')
+ pass
def visit_row(self, node):
self.table.col = 0
def depart_row(self, node):
- self.body.append('\\\\\n')
+ if self.previous_spanning_row == 1:
+ self.previous_spanning_row = 0
+ self.body.append('\\\\\n')
+ else:
+ self.body.append('\\\\\\hline\n')
self.table.rowcount += 1
def visit_entry(self, node):
- if node.has_key('morerows') or node.has_key('morecols'):
- raise UnsupportedError('%s:%s: column or row spanning cells are '
- 'not yet implemented.' %
- (self.curfilestack[-1], node.line or ''))
+ if self.remember_multirow.get(0, 0) > 1:
+ self.body.append(' & ')
if self.table.col > 0:
self.body.append(' & ')
self.table.col += 1
+ self.context.append('')
+ if 'morerows' in node:
+ self.body.append(' \multirow{')
+ self.previous_spanning_row = 1
+ self.body.append(str(node.get('morerows') + 1))
+ self.body.append('}{*}{')
+ self.context.append('}')
+ self.remember_multirow[self.table.col] = node.get('morerows') + 1
+ if 'morecols' in node:
+ self.body.append(' \multicolumn{')
+ self.body.append(str(node.get('morecols') + 1))
+ if self.table.col == 1:
+ self.body.append('}{|l|}{')
+ else:
+ self.body.append('}{l|}{')
+ self.context.append('}')
if isinstance(node.parent.parent, nodes.thead):
self.body.append('\\textbf{')
self.context.append('}')
- else:
- self.context.append('')
+ if self.remember_multirow.get(self.table.col + 1, 0) > 1:
+ self.remember_multirow[self.table.col + 1] -= 1
+ self.context.append(' & ')
def depart_entry(self, node):
self.body.append(self.context.pop()) # header
@@ -784,13 +816,17 @@ class LaTeXTranslator(nodes.NodeVisitor):
def visit_term(self, node):
ctx = '}] \\leavevmode'
- if node.has_key('ids') and node['ids']:
+ if node.get('ids'):
ctx += self.hypertarget(node['ids'][0])
self.body.append('\\item[{')
self.context.append(ctx)
def depart_term(self, node):
self.body.append(self.context.pop())
+ def visit_termsep(self, node):
+ self.body.append(', ')
+ raise nodes.SkipNode
+
def visit_classifier(self, node):
self.body.append('{[}')
def depart_classifier(self, node):
@@ -872,20 +908,20 @@ class LaTeXTranslator(nodes.NodeVisitor):
post = []
include_graphics_options = []
is_inline = self.is_inline(node)
- if attrs.has_key('scale'):
+ if 'scale' in attrs:
# Could also be done with ``scale`` option to
# ``\includegraphics``; doing it this way for consistency.
pre.append('\\scalebox{%f}{' % (attrs['scale'] / 100.0,))
post.append('}')
- if attrs.has_key('width'):
+ if 'width' in attrs:
w = self.latex_image_length(attrs['width'])
if w:
include_graphics_options.append('width=%s' % w)
- if attrs.has_key('height'):
+ if 'height' in attrs:
h = self.latex_image_length(attrs['height'])
if h:
include_graphics_options.append('height=%s' % h)
- if attrs.has_key('align'):
+ if 'align' in attrs:
align_prepost = {
# By default latex aligns the top of an image.
(1, 'top'): ('', ''),
@@ -930,13 +966,13 @@ class LaTeXTranslator(nodes.NodeVisitor):
for id in self.next_figure_ids:
ids += self.hypertarget(id, anchor=False)
self.next_figure_ids.clear()
- if node.has_key('width') and node.get('align', '') in ('left', 'right'):
+ if 'width' in node and node.get('align', '') in ('left', 'right'):
self.body.append('\\begin{wrapfigure}{%s}{%s}\n\\centering' %
(node['align'] == 'right' and 'r' or 'l',
node['width']))
self.context.append(ids + '\\end{wrapfigure}\n')
else:
- if (not node.attributes.has_key('align') or
+ if (not 'align' in node.attributes or
node.attributes['align'] == 'center'):
# centering does not add vertical space like center.
align = '\n\\centering'
@@ -1066,29 +1102,39 @@ class LaTeXTranslator(nodes.NodeVisitor):
self.body.append('\n\\end{flushright}\n')
def visit_index(self, node, scre=re.compile(r';\s*')):
- if not node.get('inline'):
+ if not node.get('inline', True):
self.body.append('\n')
entries = node['entries']
- for type, string, tid, _ in entries:
- if type == 'single':
- self.body.append(r'\index{%s}' %
- scre.sub('!', self.encode(string)))
- elif type == 'pair':
- parts = tuple(self.encode(x.strip())
- for x in string.split(';', 1))
- try:
- self.body.append(r'\indexii{%s}{%s}' % parts)
- except TypeError:
- self.builder.warn('invalid pair index entry %r' % string)
- elif type == 'triple':
- parts = tuple(self.encode(x.strip())
- for x in string.split(';', 2))
- try:
- self.body.append(r'\indexiii{%s}{%s}{%s}' % parts)
- except TypeError:
- self.builder.warn('invalid triple index entry %r' % string)
- else:
- self.builder.warn('unknown index entry type %s found' % type)
+ for type, string, tid, ismain in entries:
+ m = ''
+ if ismain:
+ m = '|textbf'
+ try:
+ if type == 'single':
+ p = scre.sub('!', self.encode(string))
+ self.body.append(r'\index{%s%s}' % (p, m))
+ elif type == 'pair':
+ p1, p2 = map(self.encode, split_into(2, 'pair', string))
+ self.body.append(r'\index{%s!%s%s}\index{%s!%s%s}' %
+ (p1, p2, m, p2, p1, m))
+ elif type == 'triple':
+ p1, p2, p3 = map(self.encode,
+ split_into(3, 'triple', string))
+ self.body.append(
+ r'\index{%s!%s %s%s}\index{%s!%s, %s%s}'
+ r'\index{%s!%s %s%s}' %
+ (p1, p2, p3, m, p2, p3, p1, m, p3, p1, p2, m))
+ elif type == 'see':
+ p1, p2 = map(self.encode, split_into(2, 'see', string))
+ self.body.append(r'\index{%s|see{%s}}' % (p1, p2))
+ elif type == 'seealso':
+ p1, p2 = map(self.encode, split_into(2, 'seealso', string))
+ self.body.append(r'\index{%s|see{%s}}' % (p1, p2))
+ else:
+ self.builder.warn(
+ 'unknown index entry type %s found' % type)
+ except ValueError, err:
+ self.builder.warn(str(err))
raise nodes.SkipNode
def visit_raw(self, node):
@@ -1106,11 +1152,17 @@ class LaTeXTranslator(nodes.NodeVisitor):
uri.startswith('https:') or uri.startswith('ftp:'):
self.body.append('\\href{%s}{' % self.encode_uri(uri))
# if configured, put the URL after the link
- if self.builder.config.latex_show_urls and \
- node.astext() != uri:
+ show_urls = self.builder.config.latex_show_urls
+ if node.astext() != uri and show_urls and show_urls != 'no':
if uri.startswith('mailto:'):
uri = uri[7:]
- self.context.append('} (%s)' % self.encode_uri(uri))
+ if show_urls == 'footnote' and not \
+ (self.in_footnote or self.in_caption):
+ # obviously, footnotes in footnotes are not going to work
+ self.context.append(
+ r'}\footnote{%s}' % self.encode_uri(uri))
+ else: # all other true values (b/w compat)
+ self.context.append('} (%s)' % self.encode_uri(uri))
else:
self.context.append('}')
elif uri.startswith('#'):
@@ -1210,15 +1262,13 @@ class LaTeXTranslator(nodes.NodeVisitor):
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':
- self.body.append(r'\samp{%s}' % content)
+ self.body.append(r'\texttt{')
else:
- self.body.append(r'\code{%s}' % content)
- raise nodes.SkipNode
+ self.body.append(r'\code{')
+ def depart_literal(self, node):
+ self.no_contractions -= 1
+ self.body.append('}')
def visit_footnote_reference(self, node):
num = node.astext().strip()
@@ -1247,15 +1297,16 @@ class LaTeXTranslator(nodes.NodeVisitor):
code = self.verbatim.rstrip('\n')
lang = self.hlsettingstack[-1][0]
linenos = code.count('\n') >= self.hlsettingstack[-1][1] - 1
- if node.has_key('language'):
+ if 'language' in node:
# code-block directives
lang = node['language']
- if node.has_key('linenos'):
+ if 'linenos' in node:
linenos = node['linenos']
+ highlight_args = node.get('highlight_args', {})
def warner(msg):
self.builder.warn(msg, (self.curfilestack[-1], node.line))
- hlcode = self.highlighter.highlight_block(code, lang, linenos,
- warn=warner)
+ hlcode = self.highlighter.highlight_block(code, lang, warn=warner,
+ linenos=linenos, **highlight_args)
# workaround for Unicode issue
hlcode = hlcode.replace(u'€', u'@texteuro[]')
# must use original Verbatim environment and "tabular" environment
@@ -1435,7 +1486,9 @@ class LaTeXTranslator(nodes.NodeVisitor):
self.verbatim += node.astext()
else:
text = self.encode(node.astext())
- self.body.append(educate_quotes_latex(text))
+ if not self.no_contractions:
+ text = educate_quotes_latex(text)
+ self.body.append(text)
def depart_Text(self, node):
pass
diff --git a/sphinx/writers/manpage.py b/sphinx/writers/manpage.py
index e49ba521..81f2988b 100644
--- a/sphinx/writers/manpage.py
+++ b/sphinx/writers/manpage.py
@@ -161,6 +161,10 @@ class ManualPageTranslator(BaseTranslator):
def depart_versionmodified(self, node):
self.depart_paragraph(node)
+ def visit_termsep(self, node):
+ self.body.append(', ')
+ raise nodes.SkipNode
+
# overwritten -- we don't want source comments to show up
def visit_comment(self, node):
raise nodes.SkipNode
@@ -193,7 +197,7 @@ class ManualPageTranslator(BaseTranslator):
def visit_admonition(self, node, name=None):
if name:
self.body.append('.IP %s\n' %
- admonitionlabels.get(name, name))
+ self.deunicode(admonitionlabels.get(name, name)))
def visit_productionlist(self, node):
self.ensure_eol()
@@ -235,6 +239,19 @@ class ManualPageTranslator(BaseTranslator):
self.body.append(self.defs['reference'][0])
self.body.append(node.astext())
self.body.append(self.defs['reference'][1])
+
+ uri = node.get('refuri', '')
+ if uri.startswith('mailto:') or uri.startswith('http:') or \
+ uri.startswith('https:') or uri.startswith('ftp:'):
+ # if configured, put the URL after the link
+ if self.builder.config.man_show_urls and \
+ node.astext() != uri:
+ if uri.startswith('mailto:'):
+ uri = uri[7:]
+ self.body.extend([
+ ' <',
+ self.defs['strong'][0], uri, self.defs['strong'][1],
+ '>'])
raise nodes.SkipNode
def visit_centered(self, node):
diff --git a/sphinx/writers/texinfo.py b/sphinx/writers/texinfo.py
new file mode 100644
index 00000000..5799e023
--- /dev/null
+++ b/sphinx/writers/texinfo.py
@@ -0,0 +1,1372 @@
+# -*- coding: utf-8 -*-
+"""
+ sphinx.writers.texinfo
+ ~~~~~~~~~~~~~~~~~~~~~~
+
+ Custom docutils writer for Texinfo.
+
+ :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
+ :license: BSD, see LICENSE for details.
+"""
+
+import re
+import string
+import textwrap
+from os import path
+
+from docutils import nodes, writers
+
+from sphinx import addnodes, __version__
+from sphinx.locale import versionlabels, _
+from sphinx.util import ustrftime
+from sphinx.writers.latex import collected_footnote
+
+
+COPYING = """\
+@quotation
+%(project)s %(release)s, %(date)s
+
+%(author)s
+
+Copyright @copyright{} %(copyright)s
+@end quotation
+"""
+
+TEMPLATE = """\
+\\input texinfo @c -*-texinfo-*-
+@c %%**start of header
+@setfilename %(filename)s
+@documentencoding UTF-8
+@ifinfo
+@*Generated by Sphinx """ + __version__ + """.@*
+@end ifinfo
+@settitle %(title)s
+@defindex ge
+@paragraphindent %(paragraphindent)s
+@exampleindent %(exampleindent)s
+@afourlatex
+%(direntry)s
+@c %%**end of header
+
+@copying
+%(copying)s
+@end copying
+
+@titlepage
+@title %(title)s
+@insertcopying
+@end titlepage
+@contents
+
+@c %%** start of user preamble
+%(preamble)s
+@c %%** end of user preamble
+
+@ifnottex
+@node Top
+@top %(title)s
+@insertcopying
+@end ifnottex
+
+@c %%**start of body
+%(body)s
+@c %%**end of body
+@bye
+"""
+
+
+def find_subsections(section):
+ """Return a list of subsections for the given ``section``."""
+ result = []
+ for child in section.children:
+ if isinstance(child, nodes.section):
+ result.append(child)
+ continue
+ result.extend(find_subsections(child))
+ return result
+
+
+class TexinfoWriter(writers.Writer):
+ """Texinfo writer for generating Texinfo documents."""
+ supported = ('texinfo', 'texi')
+
+ settings_spec = (
+ 'Texinfo Specific Options', None, (
+ ("Name of the Info file", ['--texinfo-filename'], {'default': ''}),
+ ('Dir entry', ['--texinfo-dir-entry'], {'default': ''}),
+ ('Description', ['--texinfo-dir-description'], {'default': ''}),
+ ('Category', ['--texinfo-dir-category'], {'default':
+ 'Miscellaneous'})))
+
+ settings_defaults = {}
+
+ output = None
+
+ visitor_attributes = ('output', 'fragment')
+
+ def __init__(self, builder):
+ writers.Writer.__init__(self)
+ self.builder = builder
+
+ def translate(self):
+ self.visitor = visitor = TexinfoTranslator(self.document, self.builder)
+ self.document.walkabout(visitor)
+ visitor.finish()
+ for attr in self.visitor_attributes:
+ setattr(self, attr, getattr(visitor, attr))
+
+
+class TexinfoTranslator(nodes.NodeVisitor):
+
+ ignore_missing_images = False
+
+ default_elements = {
+ 'author': '',
+ 'body': '',
+ 'copying': '',
+ 'date': '',
+ 'direntry': '',
+ 'exampleindent': 4,
+ 'filename': '',
+ 'paragraphindent': 2,
+ 'preamble': '',
+ 'project': '',
+ 'release': '',
+ 'title': '',
+ }
+
+ def __init__(self, document, builder):
+ nodes.NodeVisitor.__init__(self, document)
+ self.builder = builder
+ self.init_settings()
+
+ self.written_ids = set() # node names and anchors in output
+ self.referenced_ids = set() # node names and anchors that should
+ # be in output
+ self.indices = [] # (node name, content)
+ self.short_ids = {} # anchors --> short ids
+ self.node_names = {} # node name --> node's name to display
+ self.node_menus = {} # node name --> node's menu entries
+ self.rellinks = {} # node name --> (next, previous, up)
+
+ self.collect_indices()
+ self.collect_node_names()
+ self.collect_node_menus()
+ self.collect_rellinks()
+
+ self.body = []
+ self.context = []
+ self.previous_section = None
+ self.section_level = 0
+ self.seen_title = False
+ self.next_section_ids = set()
+ self.escape_newlines = 0
+ self.curfilestack = []
+ self.footnotestack = []
+ self.in_footnote = 0
+ self.handled_abbrs = set()
+
+ def finish(self):
+ if self.previous_section is None:
+ self.add_menu('Top')
+ for index in self.indices:
+ name, content = index
+ pointers = tuple([name] + self.rellinks[name])
+ self.body.append('\n@node %s,%s,%s,%s\n' % pointers)
+ self.body.append('@unnumbered %s\n\n%s\n' % (name, content))
+
+ while self.referenced_ids:
+ # handle xrefs with missing anchors
+ r = self.referenced_ids.pop()
+ if r not in self.written_ids:
+ self.body.append('@anchor{%s}@w{%s}\n' % (r, ' ' * 30))
+ self.fragment = ''.join(self.body).strip() + '\n'
+ self.elements['body'] = self.fragment
+ self.output = TEMPLATE % self.elements
+
+ ## Helper routines
+
+ def init_settings(self):
+ settings = self.settings = self.document.settings
+ elements = self.elements = self.default_elements.copy()
+ elements.update({
+ # if empty, the title is set to the first section title
+ 'title': settings.title,
+ 'author': settings.author,
+ # if empty, use basename of input file
+ 'filename': settings.texinfo_filename,
+ 'release': self.escape(self.builder.config.release),
+ 'project': self.escape(self.builder.config.project),
+ 'copyright': self.escape(self.builder.config.copyright),
+ 'date': self.escape(self.builder.config.today or
+ ustrftime(self.builder.config.today_fmt
+ or _('%B %d, %Y')))
+ })
+ # title
+ title = elements['title']
+ if not title:
+ title = self.document.next_node(nodes.title)
+ title = (title and title.astext()) or '<untitled>'
+ elements['title'] = self.escape_id(title) or '<untitled>'
+ # filename
+ if not elements['filename']:
+ elements['filename'] = self.document.get('source') or 'untitled'
+ if elements['filename'][-4:] in ('.txt', '.rst'):
+ elements['filename'] = elements['filename'][:-4]
+ elements['filename'] += '.info'
+ # direntry
+ if settings.texinfo_dir_entry:
+ entry = self.format_menu_entry(
+ self.escape_menu(settings.texinfo_dir_entry),
+ '(%s)' % elements['filename'],
+ self.escape_arg(settings.texinfo_dir_description))
+ elements['direntry'] = ('@dircategory %s\n'
+ '@direntry\n'
+ '%s'
+ '@end direntry\n') % (
+ self.escape_id(settings.texinfo_dir_category), entry)
+ elements['copying'] = COPYING % elements
+ # allow the user to override them all
+ elements.update(settings.texinfo_elements)
+
+ def collect_node_names(self):
+ """Generates a unique id for each section.
+
+ Assigns the attribute ``node_name`` to each section."""
+ # must have a "Top" node
+ self.document['node_name'] = 'Top'
+ self.node_names['Top'] = 'Top'
+ self.written_ids.update(('Top', 'top'))
+ # each index is a node
+ for name, content in self.indices:
+ self.node_names[name] = name
+ self.written_ids.add(name)
+ # each section is also a node
+ for section in self.document.traverse(nodes.section):
+ title = section.next_node(nodes.Titular)
+ name = (title and title.astext()) or '<untitled>'
+ node_id = self.escape_id(name) or '<untitled>'
+ assert node_id and name
+ nth, suffix = 1, ''
+ while node_id + suffix in self.written_ids:
+ nth += 1
+ suffix = '<%s>' % nth
+ node_id += suffix
+ assert node_id not in self.node_names
+ assert node_id not in self.written_ids
+ section['node_name'] = node_id
+ self.node_names[node_id] = name
+ self.written_ids.add(node_id)
+
+ def collect_node_menus(self):
+ """Collect the menu entries for each "node" section."""
+ node_menus = self.node_menus
+ for node in ([self.document] +
+ self.document.traverse(nodes.section)):
+ assert 'node_name' in node and node['node_name']
+ entries = [s['node_name'] for s in find_subsections(node)]
+ node_menus[node['node_name']] = entries
+ # try to find a suitable "Top" node
+ title = self.document.next_node(nodes.title)
+ top = (title and title.parent) or self.document
+ if not isinstance(top, (nodes.document, nodes.section)):
+ top = self.document
+ if top is not self.document:
+ entries = node_menus[top['node_name']]
+ entries += node_menus['Top'][1:]
+ node_menus['Top'] = entries
+ del node_menus[top['node_name']]
+ top['node_name'] = 'Top'
+ # handle the indices
+ for name, content in self.indices:
+ node_menus[name] = ()
+ node_menus['Top'].append(name)
+
+ def collect_rellinks(self):
+ """Collect the relative links (next, previous, up) for each "node"."""
+ rellinks = self.rellinks
+ node_menus = self.node_menus
+ for id, entries in node_menus.items():
+ rellinks[id] = ['', '', '']
+ # up's
+ for id, entries in node_menus.items():
+ for e in entries:
+ rellinks[e][2] = id
+ # next's and prev's
+ for id, entries in node_menus.items():
+ for i, id in enumerate(entries):
+ # First child's prev is empty
+ if i != 0:
+ rellinks[id][1] = entries[i-1]
+ # Last child's next is empty
+ if i != len(entries) - 1:
+ rellinks[id][0] = entries[i+1]
+ # top's next is its first child
+ try:
+ first = node_menus['Top'][0]
+ except IndexError:
+ pass
+ else:
+ rellinks['Top'][0] = first
+ rellinks[first][1] = 'Top'
+
+ ## Escaping
+ # Which characters to escape depends on the context. In some cases,
+ # namely menus and node names, it's not possible to escape certain
+ # characters.
+
+ def escape(self, s):
+ """Return a string with Texinfo command characters escaped."""
+ s = s.replace('@', '@@')
+ s = s.replace('{', '@{')
+ s = s.replace('}', '@}')
+ # prevent `` and '' quote conversion
+ s = s.replace('``', "`@w{`}")
+ s = s.replace("''", "'@w{'}")
+ # prevent "--" from being converted to an "em dash"
+ # s = s.replace('-', '@w{-}')
+ return s
+
+ def escape_arg(self, s):
+ """Return an escaped string suitable for use as an argument
+ to a Texinfo command."""
+ s = self.escape(s)
+ # commas are the argument delimeters
+ s = s.replace(',', '@comma{}')
+ # normalize white space
+ s = ' '.join(s.split()).strip()
+ return s
+
+ def escape_id(self, s):
+ """Return an escaped string suitable for node names and anchors."""
+ bad_chars = ',:.()'
+ for bc in bad_chars:
+ s = s.replace(bc, ' ')
+ s = ' '.join(s.split()).strip()
+ return self.escape(s)
+
+ def escape_menu(self, s):
+ """Return an escaped string suitable for menu entries."""
+ s = self.escape_arg(s)
+ s = s.replace(':', ';')
+ s = ' '.join(s.split()).strip()
+ return s
+
+ def ensure_eol(self):
+ """Ensure the last line in body is terminated by new line."""
+ if self.body and self.body[-1][-1:] != '\n':
+ self.body.append('\n')
+
+ def format_menu_entry(self, name, node_name, desc):
+ if name == node_name:
+ s = '* %s:: ' % (name,)
+ else:
+ s = '* %s: %s. ' % (name, node_name)
+ offset = max((24, (len(name) + 4) % 78))
+ wdesc = '\n'.join(' ' * offset + l for l in
+ textwrap.wrap(desc, width=78-offset))
+ return s + wdesc.strip() + '\n'
+
+ def add_menu_entries(self, entries, reg=re.compile(r'\s+---?\s+')):
+ for entry in entries:
+ name = self.node_names[entry]
+ # special formatting for entries that are divided by an em-dash
+ parts = reg.split(name, 1)
+ if len(parts) == 2:
+ name, desc = parts
+ else:
+ desc = ''
+ name = self.escape_menu(name)
+ desc = self.escape(desc)
+ self.body.append(self.format_menu_entry(name, entry, desc))
+
+ def add_menu(self, node_name):
+ entries = self.node_menus[node_name]
+ if not entries:
+ return
+ self.body.append('\n@menu\n')
+ self.add_menu_entries(entries)
+ if not self.node_menus[entries[0]]:
+ self.body.append('\n@end menu\n')
+ return
+
+ def _add_detailed_menu(name):
+ entries = self.node_menus[name]
+ if not entries:
+ return
+ self.body.append('\n%s\n\n' % (self.escape(self.node_names[name],)))
+ self.add_menu_entries(entries)
+ for subentry in entries:
+ _add_detailed_menu(subentry)
+
+ if node_name == 'Top':
+ self.body.append('\n@detailmenu\n'
+ ' --- The Detailed Node Listing ---\n')
+ for entry in entries:
+ _add_detailed_menu(entry)
+ if node_name == 'Top':
+ self.body.append('\n@end detailmenu')
+ self.body.append('\n@end menu\n\n')
+
+ def tex_image_length(self, width_str):
+ match = re.match('(\d*\.?\d*)\s*(\S*)', width_str)
+ if not match:
+ # fallback
+ return width_str
+ res = width_str
+ amount, unit = match.groups()[:2]
+ if not unit or unit == "px":
+ # pixels: let TeX alone
+ return ''
+ elif unit == "%":
+ # a4paper: textwidth=418.25368pt
+ res = "%d.0pt" % (float(amount) * 4.1825368)
+ return res
+
+ def collect_indices(self):
+ def generate(content, collapsed):
+ ret = ['\n@menu\n']
+ for letter, entries in content:
+ for entry in entries:
+ if not entry[3]:
+ continue
+ name = self.escape_menu(entry[0])
+ sid = self.get_short_id('%s:%s' % (entry[2], entry[3]))
+ desc = self.escape_arg(entry[6])
+ me = self.format_menu_entry(name, sid, desc)
+ ret.append(me)
+ ret.append('@end menu\n')
+ return ''.join(ret)
+
+ indices_config = self.builder.config.texinfo_domain_indices
+ if indices_config:
+ for domain in self.builder.env.domains.itervalues():
+ for indexcls in domain.indices:
+ indexname = '%s-%s' % (domain.name, indexcls.name)
+ if isinstance(indices_config, list):
+ if indexname not in indices_config:
+ continue
+ content, collapsed = indexcls(domain).generate(
+ self.builder.docnames)
+ if not content:
+ continue
+ node_name = self.escape_id(indexcls.localname)
+ self.indices.append((node_name,
+ generate(content, collapsed)))
+ self.indices.append((_('Index'), '\n@printindex ge\n'))
+
+ # this is copied from the latex writer
+ # TODO: move this to sphinx.util
+
+ def collect_footnotes(self, node):
+ fnotes = {}
+ def footnotes_under(n):
+ if isinstance(n, nodes.footnote):
+ yield n
+ else:
+ for c in n.children:
+ if isinstance(c, addnodes.start_of_file):
+ continue
+ for k in footnotes_under(c):
+ yield k
+ for fn in footnotes_under(node):
+ num = fn.children[0].astext().strip()
+ fnotes[num] = [collected_footnote(*fn.children), False]
+ return fnotes
+
+ ## xref handling
+
+ def get_short_id(self, id):
+ """Return a shorter 'id' associated with ``id``."""
+ # Shorter ids improve paragraph filling in places
+ # that the id is hidden by Emacs.
+ try:
+ sid = self.short_ids[id]
+ except KeyError:
+ sid = hex(len(self.short_ids))[2:]
+ self.short_ids[id] = sid
+ return sid
+
+ def add_anchor(self, id, node):
+ if id.startswith('index-'):
+ return
+ id = self.curfilestack[-1] + ':' + id
+ eid = self.escape_id(id)
+ sid = self.get_short_id(id)
+ for id in (eid, sid):
+ if id not in self.written_ids:
+ self.body.append('@anchor{%s}' % id)
+ self.written_ids.add(id)
+
+ def add_xref(self, id, name, node):
+ name = self.escape_menu(name)
+ sid = self.get_short_id(id)
+ self.body.append('@pxref{%s,,%s}' % (sid, name))
+ self.referenced_ids.add(sid)
+ self.referenced_ids.add(self.escape_id(id))
+
+ ## Visiting
+
+ def visit_document(self, node):
+ self.footnotestack.append(self.collect_footnotes(node))
+ self.curfilestack.append(node.get('docname', ''))
+ if 'docname' in node:
+ self.add_anchor(':doc', node)
+ def depart_document(self, node):
+ self.footnotestack.pop()
+ self.curfilestack.pop()
+
+ def visit_Text(self, node):
+ s = self.escape(node.astext())
+ if self.escape_newlines:
+ s = s.replace('\n', ' ')
+ self.body.append(s)
+ def depart_Text(self, node):
+ pass
+
+ def visit_section(self, node):
+ self.next_section_ids.update(node.get('ids', []))
+ if not self.seen_title:
+ return
+ if self.previous_section:
+ self.add_menu(self.previous_section['node_name'])
+ else:
+ self.add_menu('Top')
+
+ node_name = node['node_name']
+ pointers = tuple([node_name] + self.rellinks[node_name])
+ self.body.append('\n@node %s,%s,%s,%s\n' % pointers)
+ for id in self.next_section_ids:
+ self.add_anchor(id, node)
+
+ self.next_section_ids.clear()
+ self.previous_section = node
+ self.section_level += 1
+
+ def depart_section(self, node):
+ self.section_level -= 1
+
+ headings = (
+ '@unnumbered',
+ '@chapter',
+ '@section',
+ '@subsection',
+ '@subsubsection',
+ )
+
+ rubrics = (
+ '@heading',
+ '@subheading',
+ '@subsubheading',
+ )
+
+ def visit_title(self, node):
+ if not self.seen_title:
+ self.seen_title = 1
+ raise nodes.SkipNode
+ parent = node.parent
+ if isinstance(parent, nodes.table):
+ return
+ if isinstance(parent, (nodes.Admonition, nodes.sidebar, nodes.topic)):
+ raise nodes.SkipNode
+ elif not isinstance(parent, nodes.section):
+ self.builder.warn(
+ 'encountered title node not in section, topic, table, '
+ 'admonition or sidebar', (self.curfilestack[-1], node.line))
+ self.visit_rubric(node)
+ else:
+ try:
+ heading = self.headings[self.section_level]
+ except IndexError:
+ heading = self.headings[-1]
+ self.body.append('\n%s ' % heading)
+
+ def depart_title(self, node):
+ self.body.append('\n\n')
+
+ def visit_rubric(self, node):
+ if len(node.children) == 1 and node.children[0].astext() in \
+ ('Footnotes', _('Footnotes')):
+ raise nodes.SkipNode
+ try:
+ rubric = self.rubrics[self.section_level]
+ except IndexError:
+ rubric = self.rubrics[-1]
+ self.body.append('\n%s ' % rubric)
+ def depart_rubric(self, node):
+ self.body.append('\n\n')
+
+ def visit_subtitle(self, node):
+ self.body.append('\n\n@noindent\n')
+ def depart_subtitle(self, node):
+ self.body.append('\n\n')
+
+ ## References
+
+ def visit_target(self, node):
+ # postpone the labels until after the sectioning command
+ parindex = node.parent.index(node)
+ try:
+ try:
+ next = node.parent[parindex+1]
+ except IndexError:
+ # last node in parent, look at next after parent
+ # (for section of equal level)
+ next = node.parent.parent[node.parent.parent.index(node.parent)]
+ if isinstance(next, nodes.section):
+ if node.get('refid'):
+ self.next_section_ids.add(node['refid'])
+ self.next_section_ids.update(node['ids'])
+ return
+ except IndexError:
+ pass
+ if 'refuri' in node:
+ return
+ if node.get('refid'):
+ self.add_anchor(node['refid'], node)
+ for id in node['ids']:
+ self.add_anchor(id, node)
+ def depart_target(self, node):
+ pass
+
+ def visit_reference(self, node):
+ # an xref's target is displayed in Info so we ignore a few
+ # cases for the sake of appearance
+ if isinstance(node.parent, (nodes.title, addnodes.desc_type,)):
+ return
+ if isinstance(node[0], nodes.image):
+ return
+ name = node.get('name', node.astext()).strip()
+ uri = node.get('refuri', '')
+ if not uri and node.get('refid'):
+ uri = '%' + self.curfilestack[-1] + '#' + node['refid']
+ if not uri:
+ return
+ if uri.startswith('mailto:'):
+ uri = self.escape_arg(uri[7:])
+ name = self.escape_arg(name)
+ if not name or name == uri:
+ self.body.append('@email{%s}' % uri)
+ else:
+ self.body.append('@email{%s,%s}' % (uri, name))
+ elif uri.startswith('#'):
+ # references to labels in the same document
+ id = self.curfilestack[-1] + ':' + uri[1:]
+ self.add_xref(id, name, node)
+ elif uri.startswith('%'):
+ # references to documents or labels inside documents
+ hashindex = uri.find('#')
+ if hashindex == -1:
+ # reference to the document
+ id = uri[1:] + '::doc'
+ else:
+ # reference to a label
+ id = uri[1:].replace('#', ':')
+ self.add_xref(id, name, node)
+ elif uri.startswith('info:'):
+ # references to an external Info file
+ uri = uri[5:].replace('_', ' ')
+ uri = self.escape_arg(uri)
+ id = 'Top'
+ if '#' in uri:
+ uri, id = uri.split('#', 1)
+ id = self.escape_id(id)
+ name = self.escape_menu(name)
+ if name == id:
+ self.body.append('@pxref{%s,,,%s}' % (id, uri))
+ else:
+ self.body.append('@pxref{%s,,%s,%s}' % (id, name, uri))
+ else:
+ uri = self.escape_arg(uri)
+ name = self.escape_arg(name)
+ show_urls = self.builder.config.texinfo_show_urls
+ if self.in_footnote:
+ show_urls = 'inline'
+ if not name or uri == name:
+ self.body.append('@indicateurl{%s}' % uri)
+ elif show_urls == 'inline':
+ self.body.append('@uref{%s,%s}' % (uri, name))
+ elif show_urls == 'no':
+ self.body.append('@uref{%s,,%s}' % (uri, name))
+ else:
+ self.body.append('%s@footnote{%s}' % (name, uri))
+ raise nodes.SkipNode
+
+ def depart_reference(self, node):
+ pass
+
+ def visit_title_reference(self, node):
+ text = node.astext()
+ self.body.append('@cite{%s}' % self.escape_arg(text))
+ raise nodes.SkipNode
+
+ ## Blocks
+
+ def visit_paragraph(self, node):
+ if 'continued' in node or isinstance(node.parent, nodes.compound):
+ self.body.append('\n@noindent')
+ self.body.append('\n')
+ def depart_paragraph(self, node):
+ self.body.append('\n')
+
+ def visit_block_quote(self, node):
+ self.body.append('\n@quotation\n')
+ def depart_block_quote(self, node):
+ self.ensure_eol()
+ self.body.append('@end quotation\n')
+
+ def visit_literal_block(self, node):
+ self.body.append('\n@example\n')
+ def depart_literal_block(self, node):
+ self.body.append('\n@end example\n\n'
+ '@noindent\n')
+
+ visit_doctest_block = visit_literal_block
+ depart_doctest_block = depart_literal_block
+
+ def visit_line_block(self, node):
+ if not isinstance(node.parent, nodes.line_block):
+ self.body.append('\n\n')
+ self.body.append('@display\n')
+ def depart_line_block(self, node):
+ self.body.append('@end display\n')
+ if not isinstance(node.parent, nodes.line_block):
+ self.body.append('\n\n')
+
+ def visit_line(self, node):
+ self.escape_newlines += 1
+ def depart_line(self, node):
+ self.body.append('@w{ }\n')
+ self.escape_newlines -= 1
+
+ ## Inline
+
+ def visit_strong(self, node):
+ self.body.append('@strong{')
+ def depart_strong(self, node):
+ self.body.append('}')
+
+ def visit_emphasis(self, node):
+ self.body.append('@emph{')
+ def depart_emphasis(self, node):
+ self.body.append('}')
+
+ def visit_literal(self, node):
+ self.body.append('@code{')
+ def depart_literal(self, node):
+ self.body.append('}')
+
+ def visit_superscript(self, node):
+ self.body.append('@w{^')
+ def depart_superscript(self, node):
+ self.body.append('}')
+
+ def visit_subscript(self, node):
+ self.body.append('@w{[')
+ def depart_subscript(self, node):
+ self.body.append(']}')
+
+ ## Footnotes
+
+ def visit_footnote(self, node):
+ raise nodes.SkipNode
+
+ def visit_collected_footnote(self, node):
+ self.in_footnote += 1
+ self.body.append('@footnote{')
+ def depart_collected_footnote(self, node):
+ self.body.append('}')
+ self.in_footnote -= 1
+
+ def visit_footnote_reference(self, node):
+ num = node.astext().strip()
+ try:
+ footnode, used = self.footnotestack[-1][num]
+ except (KeyError, IndexError):
+ raise nodes.SkipNode
+ # footnotes are repeated for each reference
+ footnode.walkabout(self)
+ raise nodes.SkipChildren
+
+ def visit_citation(self, node):
+ for id in node.get('ids'):
+ self.add_anchor(id, node)
+ def depart_citation(self, node):
+ pass
+
+ def visit_citation_reference(self, node):
+ self.body.append('@w{[')
+ def depart_citation_reference(self, node):
+ self.body.append(']}')
+
+ ## Lists
+
+ def visit_bullet_list(self, node):
+ bullet = node.get('bullet', '*')
+ self.body.append('\n\n@itemize %s\n' % bullet)
+ def depart_bullet_list(self, node):
+ self.ensure_eol()
+ self.body.append('@end itemize\n')
+
+ def visit_enumerated_list(self, node):
+ # doesn't support Roman numerals
+ enum = node.get('enumtype', 'arabic')
+ starters = {'arabic': '',
+ 'loweralpha': 'a',
+ 'upperalpha': 'A',}
+ start = node.get('start', starters.get(enum, ''))
+ self.body.append('\n\n@enumerate %s\n' % start)
+ def depart_enumerated_list(self, node):
+ self.ensure_eol()
+ self.body.append('@end enumerate\n')
+
+ def visit_list_item(self, node):
+ self.body.append('\n@item ')
+ def depart_list_item(self, node):
+ pass
+
+ ## Option List
+
+ def visit_option_list(self, node):
+ self.body.append('\n\n@table @option\n')
+ def depart_option_list(self, node):
+ self.ensure_eol()
+ self.body.append('@end table\n')
+
+ def visit_option_list_item(self, node):
+ pass
+ def depart_option_list_item(self, node):
+ pass
+
+ def visit_option_group(self, node):
+ self.at_item_x = '@item'
+ def depart_option_group(self, node):
+ pass
+
+ def visit_option(self, node):
+ self.body.append('\n%s ' % self.at_item_x)
+ self.at_item_x = '@itemx'
+ def depart_option(self, node):
+ pass
+
+ def visit_option_string(self, node):
+ pass
+ def depart_option_string(self, node):
+ pass
+
+ def visit_option_argument(self, node):
+ self.body.append(node.get('delimiter', ' '))
+ def depart_option_argument(self, node):
+ pass
+
+ def visit_description(self, node):
+ self.body.append('\n')
+ def depart_description(self, node):
+ pass
+
+ ## Definitions
+
+ def visit_definition_list(self, node):
+ self.body.append('\n\n@table @asis\n')
+ def depart_definition_list(self, node):
+ self.ensure_eol()
+ self.body.append('@end table\n')
+
+ def visit_definition_list_item(self, node):
+ self.at_item_x = '@item'
+ def depart_definition_list_item(self, node):
+ pass
+
+ def visit_term(self, node):
+ for id in node.get('ids'):
+ self.add_anchor(id, node)
+ # anchors and indexes need to go in front
+ for n in node[::]:
+ if isinstance(n, (addnodes.index, nodes.target)):
+ n.walkabout(self)
+ node.remove(n)
+ self.body.append('\n%s ' % self.at_item_x)
+ self.at_item_x = '@itemx'
+ def depart_term(self, node):
+ pass
+
+ def visit_termsep(self, node):
+ self.body.append('\n%s ' % self.at_item_x)
+ def depart_termsep(self, node):
+ pass
+
+ def visit_classifier(self, node):
+ self.body.append(' : ')
+ def depart_classifier(self, node):
+ pass
+
+ def visit_definition(self, node):
+ self.body.append('\n')
+ def depart_definition(self, node):
+ pass
+
+ ## Tables
+
+ def visit_table(self, node):
+ self.entry_sep = '@item'
+ def depart_table(self, node):
+ self.body.append('\n@end multitable\n\n')
+
+ def visit_tabular_col_spec(self, node):
+ pass
+ def depart_tabular_col_spec(self, node):
+ pass
+
+ def visit_colspec(self, node):
+ self.colwidths.append(node['colwidth'])
+ if len(self.colwidths) != self.n_cols:
+ return
+ self.body.append('\n\n@multitable ')
+ for i, n in enumerate(self.colwidths):
+ self.body.append('{%s} ' %('x' * (n+2)))
+ def depart_colspec(self, node):
+ pass
+
+ def visit_tgroup(self, node):
+ self.colwidths = []
+ self.n_cols = node['cols']
+ def depart_tgroup(self, node):
+ pass
+
+ def visit_thead(self, node):
+ self.entry_sep = '@headitem'
+ def depart_thead(self, node):
+ pass
+
+ def visit_tbody(self, node):
+ pass
+ def depart_tbody(self, node):
+ pass
+
+ def visit_row(self, node):
+ pass
+ def depart_row(self, node):
+ self.entry_sep = '@item'
+
+ def visit_entry(self, node):
+ self.body.append('\n%s\n' % self.entry_sep)
+ self.entry_sep = '@tab'
+ def depart_entry(self, node):
+ for i in xrange(node.get('morecols', 0)):
+ self.body.append('\n@tab\n')
+
+ ## Field Lists
+
+ def visit_field_list(self, node):
+ self.body.append('\n\n@itemize @w\n')
+ def depart_field_list(self, node):
+ self.ensure_eol()
+ self.body.append('@end itemize\n')
+
+ def visit_field(self, node):
+ if not isinstance(node.parent, nodes.field_list):
+ self.visit_field_list(node)
+ def depart_field(self, node):
+ if not isinstance(node.parent, nodes.field_list):
+ self.depart_field_list(node)
+
+ def visit_field_name(self, node):
+ self.body.append('\n@item ')
+ def depart_field_name(self, node):
+ self.body.append(': ')
+
+ def visit_field_body(self, node):
+ pass
+ def depart_field_body(self, node):
+ pass
+
+ ## Admonitions
+
+ def visit_admonition(self, node, name=''):
+ if not name:
+ name = self.escape(node[0].astext())
+ self.body.append('\n@cartouche\n'
+ '@quotation %s ' % name)
+ def depart_admonition(self, node):
+ self.ensure_eol()
+ self.body.append('@end quotation\n'
+ '@end cartouche\n')
+
+ def _make_visit_admonition(typ):
+ def visit(self, node):
+ self.visit_admonition(node, self.escape(_(typ)))
+ return visit
+
+ visit_attention = _make_visit_admonition('Attention')
+ depart_attention = depart_admonition
+ visit_caution = _make_visit_admonition('Caution')
+ depart_caution = depart_admonition
+ visit_danger = _make_visit_admonition('Danger')
+ depart_danger = depart_admonition
+ visit_error = _make_visit_admonition('Error')
+ depart_error = depart_admonition
+ visit_important = _make_visit_admonition('Important')
+ depart_important = depart_admonition
+ visit_note = _make_visit_admonition('Note')
+ depart_note = depart_admonition
+ visit_tip = _make_visit_admonition('Tip')
+ depart_tip = depart_admonition
+ visit_hint = _make_visit_admonition('Hint')
+ depart_hint = depart_admonition
+ visit_warning = _make_visit_admonition('Warning')
+ depart_warning = depart_admonition
+
+ ## Misc
+
+ def visit_docinfo(self, node):
+ raise nodes.SkipNode
+
+ def visit_generated(self, node):
+ raise nodes.SkipNode
+
+ def visit_header(self, node):
+ raise nodes.SkipNode
+
+ def visit_footer(self, node):
+ raise nodes.SkipNode
+
+ def visit_container(self, node):
+ pass
+ def depart_container(self, node):
+ pass
+
+ def visit_decoration(self, node):
+ pass
+ def depart_decoration(self, node):
+ pass
+
+ def visit_topic(self, node):
+ # ignore TOC's since we have to have a "menu" anyway
+ if 'contents' in node.get('classes', []):
+ raise nodes.SkipNode
+ title = node[0]
+ self.visit_rubric(title)
+ self.body.append('%s\n' % self.escape(title.astext()))
+ def depart_topic(self, node):
+ pass
+
+ def visit_transition(self, node):
+ self.body.append('\n\n@exdent @w{ %s}\n\n' % ('* ' * 30))
+ def depart_transition(self, node):
+ pass
+
+ def visit_attribution(self, node):
+ self.body.append('\n\n@center --- ')
+ def depart_attribution(self, node):
+ self.body.append('\n\n')
+
+ def visit_raw(self, node):
+ format = node.get('format', '').split()
+ if 'texinfo' in format or 'texi' in format:
+ self.body.append(node.astext())
+ raise nodes.SkipNode
+
+ def visit_figure(self, node):
+ self.body.append('\n\n@float Figure\n')
+ def depart_figure(self, node):
+ self.body.append('\n@end float\n\n')
+
+ def visit_caption(self, node):
+ if not isinstance(node.parent, nodes.figure):
+ self.builder.warn('caption not inside a figure.',
+ (self.curfilestack[-1], node.line))
+ return
+ self.body.append('\n@caption{')
+ def depart_caption(self, node):
+ if isinstance(node.parent, nodes.figure):
+ self.body.append('}\n')
+
+ def visit_image(self, node):
+ if node['uri'] in self.builder.images:
+ uri = self.builder.images[node['uri']]
+ else:
+ # missing image!
+ if self.ignore_missing_images:
+ return
+ uri = node['uri']
+ if uri.find('://') != -1:
+ # ignore remote images
+ return
+ name, ext = path.splitext(uri)
+ attrs = node.attributes
+ # width and height ignored in non-tex output
+ width = self.tex_image_length(attrs.get('width', ''))
+ height = self.tex_image_length(attrs.get('height', ''))
+ alt = self.escape_arg(attrs.get('alt', ''))
+ self.body.append('\n@image{%s,%s,%s,%s,%s}\n' %
+ (name, width, height, alt, ext[1:]))
+ def depart_image(self, node):
+ pass
+
+ def visit_compound(self, node):
+ pass
+ def depart_compound(self, node):
+ pass
+
+ def visit_sidebar(self, node):
+ self.visit_topic(node)
+ def depart_sidebar(self, node):
+ self.depart_topic(node)
+
+ def visit_label(self, node):
+ self.body.append('@w{(')
+ def depart_label(self, node):
+ self.body.append(')} ')
+
+ def visit_legend(self, node):
+ pass
+ def depart_legend(self, node):
+ pass
+
+ def visit_substitution_reference(self, node):
+ pass
+ def depart_substitution_reference(self, node):
+ pass
+
+ def visit_substitution_definition(self, node):
+ raise nodes.SkipNode
+
+ def visit_system_message(self, node):
+ self.body.append('\n@w{----------- System Message: %s/%s -----------} '
+ '(%s, line %s)\n' % (
+ node.get('type', '?'),
+ node.get('level', '?'),
+ self.escape(node.get('source', '?')),
+ node.get('line', '?')))
+ def depart_system_message(self, node):
+ pass
+
+ def visit_comment(self, node):
+ self.body.append('\n')
+ for line in node.astext().splitlines():
+ self.body.append('@c %s\n' % line)
+ raise nodes.SkipNode
+
+ def visit_problematic(self, node):
+ self.body.append('>')
+ def depart_problematic(self, node):
+ self.body.append('<')
+
+ def unimplemented_visit(self, node):
+ self.builder.warn("unimplemented node type: %r" % node,
+ (self.curfilestack[-1], node.line))
+
+ def unknown_visit(self, node):
+ self.builder.warn("unknown node type: %r" % node,
+ (self.curfilestack[-1], node.line))
+ def unknown_departure(self, node):
+ pass
+
+ ### Sphinx specific
+
+ def visit_productionlist(self, node):
+ self.visit_literal_block(None)
+ names = []
+ for production in node:
+ names.append(production['tokenname'])
+ maxlen = max(len(name) for name in names)
+ for production in node:
+ if production['tokenname']:
+ for id in production.get('ids'):
+ self.add_anchor(id, production)
+ s = production['tokenname'].ljust(maxlen) + ' ::='
+ lastname = production['tokenname']
+ else:
+ s = '%s ' % (' '*maxlen)
+ self.body.append(self.escape(s))
+ self.body.append(self.escape(production.astext() + '\n'))
+ self.depart_literal_block(None)
+ raise nodes.SkipNode
+
+ def visit_production(self, node):
+ pass
+ def depart_production(self, node):
+ pass
+
+ def visit_literal_emphasis(self, node):
+ self.body.append('@code{')
+ def depart_literal_emphasis(self, node):
+ self.body.append('}')
+
+ def visit_index(self, node):
+ # terminate the line but don't prevent paragraph breaks
+ if isinstance(node.parent, nodes.paragraph):
+ self.ensure_eol()
+ else:
+ self.body.append('\n')
+ for entry in node['entries']:
+ typ, text, tid, text2 = entry
+ text = self.escape_menu(text)
+ self.body.append('@geindex %s\n' % text)
+
+ def visit_refcount(self, node):
+ self.body.append('\n')
+ def depart_refcount(self, node):
+ self.body.append('\n')
+
+ def visit_versionmodified(self, node):
+ intro = versionlabels[node['type']] % node['version']
+ if node.children:
+ intro += ': '
+ else:
+ intro += '.'
+ self.body.append('\n%s' % self.escape(intro))
+ def depart_versionmodified(self, node):
+ self.body.append('\n')
+
+ def visit_start_of_file(self, node):
+ # add a document target
+ self.next_section_ids.add(':doc')
+ self.curfilestack.append(node['docname'])
+ self.footnotestack.append(self.collect_footnotes(node))
+ def depart_start_of_file(self, node):
+ self.curfilestack.pop()
+ self.footnotestack.pop()
+
+ def visit_centered(self, node):
+ txt = self.escape_arg(node.astext())
+ self.body.append('\n\n@center %s\n\n' % txt)
+ raise nodes.SkipNode
+
+ def visit_seealso(self, node):
+ self.visit_topic(node)
+ def depart_seealso(self, node):
+ self.depart_topic(node)
+
+ def visit_meta(self, node):
+ raise nodes.SkipNode
+
+ def visit_glossary(self, node):
+ pass
+ def depart_glossary(self, node):
+ pass
+
+ def visit_acks(self, node):
+ self.body.append('\n\n')
+ self.body.append(', '.join(n.astext()
+ for n in node.children[0].children) + '.')
+ self.body.append('\n\n')
+ raise nodes.SkipNode
+
+ def visit_highlightlang(self, node):
+ pass
+ def depart_highlightlang(self, node):
+ pass
+
+ ## Desc
+
+ def visit_desc(self, node):
+ self.at_deffnx = '@deffn'
+ def depart_desc(self, node):
+ self.ensure_eol()
+ self.body.append('@end deffn\n')
+
+ def visit_desc_signature(self, node):
+ objtype = node.parent['objtype']
+ if objtype != 'describe':
+ for id in node.get('ids'):
+ self.add_anchor(id, node)
+ # use the full name of the objtype for the category
+ try:
+ domain = self.builder.env.domains[node.parent['domain']]
+ primary = self.builder.config.primary_domain
+ name = domain.get_type_name(domain.object_types[objtype],
+ primary == domain.name)
+ except KeyError:
+ name = objtype
+ category = self.escape_arg(string.capwords(name))
+ self.body.append('\n%s {%s} ' % (self.at_deffnx, category))
+ self.at_deffnx = '@deffnx'
+ def depart_desc_signature(self, node):
+ self.body.append("\n")
+
+ def visit_desc_name(self, node):
+ pass
+ def depart_desc_name(self, node):
+ pass
+
+ def visit_desc_addname(self, node):
+ pass
+ def depart_desc_addname(self, node):
+ pass
+
+ def visit_desc_type(self, node):
+ pass
+ def depart_desc_type(self, node):
+ pass
+
+ def visit_desc_returns(self, node):
+ self.body.append(' -> ')
+ def depart_desc_returns(self, node):
+ pass
+
+ def visit_desc_parameterlist(self, node):
+ self.body.append(' (')
+ self.first_param = 1
+ def depart_desc_parameterlist(self, node):
+ self.body.append(')')
+
+ def visit_desc_parameter(self, node):
+ if not self.first_param:
+ self.body.append(', ')
+ else:
+ self.first_param = 0
+ text = self.escape(node.astext())
+ # replace no-break spaces with normal ones
+ text = text.replace(u' ', '@w{ }')
+ self.body.append(text)
+ raise nodes.SkipNode
+
+ def visit_desc_optional(self, node):
+ self.body.append('[')
+ def depart_desc_optional(self, node):
+ self.body.append(']')
+
+ def visit_desc_annotation(self, node):
+ raise nodes.SkipNode
+
+ def visit_desc_content(self, node):
+ pass
+ def depart_desc_content(self, node):
+ pass
+
+ def visit_inline(self, node):
+ pass
+ def depart_inline(self, node):
+ pass
+
+ def visit_abbreviation(self, node):
+ abbr = node.astext()
+ self.body.append('@abbr{')
+ if node.hasattr('explanation') and abbr not in self.handled_abbrs:
+ self.context.append(',%s}' % self.escape_arg(node['explanation']))
+ self.handled_abbrs.add(abbr)
+ else:
+ self.context.append('}')
+ def depart_abbreviation(self, node):
+ self.body.append(self.context.pop())
+
+ def visit_download_reference(self, node):
+ pass
+ def depart_download_reference(self, node):
+ pass
+
+ def visit_hlist(self, node):
+ self.visit_bullet_list(node)
+ def depart_hlist(self, node):
+ self.depart_bullet_list(node)
+
+ def visit_hlistcol(self, node):
+ pass
+ def depart_hlistcol(self, node):
+ pass
+
+ def visit_pending_xref(self, node):
+ pass
+ def depart_pending_xref(self, node):
+ pass
diff --git a/sphinx/writers/text.py b/sphinx/writers/text.py
index 4d28e7e4..e5ab070c 100644
--- a/sphinx/writers/text.py
+++ b/sphinx/writers/text.py
@@ -8,7 +8,7 @@
:copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
:license: BSD, see LICENSE for details.
"""
-
+import os
import re
import textwrap
@@ -59,6 +59,14 @@ class TextTranslator(nodes.NodeVisitor):
def __init__(self, document, builder):
nodes.NodeVisitor.__init__(self, document)
+ newlines = builder.config.text_newlines
+ if newlines == 'windows':
+ self.nl = '\r\n'
+ elif newlines == 'native':
+ self.nl = os.linesep
+ else:
+ self.nl = '\n'
+ self.sectionchars = builder.config.text_sectionchars
self.states = [[]]
self.stateindent = [0]
self.list_counter = []
@@ -105,9 +113,9 @@ class TextTranslator(nodes.NodeVisitor):
self.new_state(0)
def depart_document(self, node):
self.end_state()
- self.body = '\n'.join(line and (' '*indent + line)
- for indent, lines in self.states[0]
- for line in lines)
+ self.body = self.nl.join(line and (' '*indent + line)
+ for indent, lines in self.states[0]
+ for line in lines)
# XXX header/footer?
def visit_highlightlang(self, node):
@@ -232,7 +240,7 @@ class TextTranslator(nodes.NodeVisitor):
def visit_desc_content(self, node):
self.new_state()
- self.add_text('\n')
+ self.add_text(self.nl)
def depart_desc_content(self, node):
self.end_state()
@@ -258,7 +266,7 @@ class TextTranslator(nodes.NodeVisitor):
lastname = production['tokenname']
else:
self.add_text('%s ' % (' '*len(lastname)))
- self.add_text(production.astext() + '\n')
+ self.add_text(production.astext() + self.nl)
self.end_state(wrap=False)
raise nodes.SkipNode
@@ -358,7 +366,7 @@ class TextTranslator(nodes.NodeVisitor):
'not implemented.')
self.new_state(0)
def depart_entry(self, node):
- text = '\n'.join('\n'.join(x[1]) for x in self.states.pop())
+ text = self.nl.join(self.nl.join(x[1]) for x in self.states.pop())
self.stateindent.pop()
self.table[-1].append(text)
@@ -394,10 +402,10 @@ class TextTranslator(nodes.NodeVisitor):
for width in realwidths:
out.append(char * (width+2))
out.append('+')
- self.add_text(''.join(out) + '\n')
+ self.add_text(''.join(out) + self.nl)
def writerow(row):
- lines = map(None, *row)
+ lines = zip(*row)
for line in lines:
out = ['|']
for i, cell in enumerate(line):
@@ -406,7 +414,7 @@ class TextTranslator(nodes.NodeVisitor):
else:
out.append(' ' * (realwidths[i] + 2))
out.append('|')
- self.add_text(''.join(out) + '\n')
+ self.add_text(''.join(out) + self.nl)
for i, row in enumerate(fmted_rows):
if separator and i == separator:
@@ -484,6 +492,10 @@ class TextTranslator(nodes.NodeVisitor):
if not self._li_has_classifier:
self.end_state(end=None)
+ def visit_termsep(self, node):
+ self.add_text(', ')
+ raise nodes.SkipNode
+
def visit_classifier(self, node):
self.add_text(' : ')
def depart_classifier(self, node):
@@ -660,9 +672,9 @@ class TextTranslator(nodes.NodeVisitor):
self.add_text('*')
def visit_literal(self, node):
- self.add_text('``')
+ self.add_text('"')
def depart_literal(self, node):
- self.add_text('``')
+ self.add_text('"')
def visit_subscript(self, node):
self.add_text('_')
diff --git a/sphinx/writers/websupport.py b/sphinx/writers/websupport.py
new file mode 100644
index 00000000..f75cd47b
--- /dev/null
+++ b/sphinx/writers/websupport.py
@@ -0,0 +1,46 @@
+# -*- coding: utf-8 -*-
+"""
+ sphinx.writers.websupport
+ ~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ sphinx.websupport writer that adds comment-related annotations.
+
+ :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
+ :license: BSD, see LICENSE for details.
+"""
+
+from sphinx.writers.html import HTMLTranslator
+from sphinx.util.websupport import is_commentable
+
+
+class WebSupportTranslator(HTMLTranslator):
+ """
+ Our custom HTML translator.
+ """
+
+ def __init__(self, builder, *args, **kwargs):
+ HTMLTranslator.__init__(self, builder, *args, **kwargs)
+ self.comment_class = 'sphinx-has-comment'
+
+ def dispatch_visit(self, node):
+ if is_commentable(node):
+ self.handle_visit_commentable(node)
+ HTMLTranslator.dispatch_visit(self, node)
+
+ def handle_visit_commentable(self, node):
+ # We will place the node in the HTML id attribute. If the node
+ # already has an id (for indexing purposes) put an empty
+ # span with the existing id directly before this node's HTML.
+ self.add_db_node(node)
+ if node.attributes['ids']:
+ self.body.append('<span id="%s"></span>'
+ % node.attributes['ids'][0])
+ node.attributes['ids'] = ['s%s' % node.uid]
+ node.attributes['classes'].append(self.comment_class)
+
+ def add_db_node(self, node):
+ storage = self.builder.storage
+ if not storage.has_node(node.uid):
+ storage.add_node(id=node.uid,
+ document=self.builder.cur_docname,
+ source=node.rawsource or node.astext())
diff --git a/tests/coverage.py b/tests/coverage.py
index 117fd4f2..95f6f844 100755
--- a/tests/coverage.py
+++ b/tests/coverage.py
@@ -362,8 +362,9 @@ class coverage:
settings[o[2:]] = 1
elif o[2:] + '=' in long_opts:
settings[o[2:]+'='] = a
- else: #pragma: no cover
- pass # Can't get here, because getopt won't return anything unknown.
+ else: #pragma: no cover
+ # Can't get here, because getopt won't return anything unknown.
+ pass
if settings.get('help'):
help_fn()
@@ -645,20 +646,23 @@ class coverage:
def find_docstring_pass_pair(self, tree, spots):
for i in range(1, len(tree)):
- if self.is_string_constant(tree[i]) and self.is_pass_stmt(tree[i+1]):
+ if (self.is_string_constant(tree[i])
+ and self.is_pass_stmt(tree[i+1])):
first_line = self.first_line_of_tree(tree[i])
last_line = self.last_line_of_tree(tree[i+1])
self.record_multiline(spots, first_line, last_line)
def is_string_constant(self, tree):
try:
- return tree[0] == symbol.stmt and tree[1][1][1][0] == symbol.expr_stmt
+ return (tree[0] == symbol.stmt
+ and tree[1][1][1][0] == symbol.expr_stmt)
except:
return False
def is_pass_stmt(self, tree):
try:
- return tree[0] == symbol.stmt and tree[1][1][1][0] == symbol.pass_stmt
+ return (tree[0] == symbol.stmt
+ and tree[1][1][1][0] == symbol.pass_stmt)
except:
return False
@@ -761,7 +765,7 @@ class coverage:
pairs = []
while i < len(statements) and j < len(lines):
if statements[i] == lines[j]:
- if start == None:
+ if start is None:
start = lines[j]
end = lines[j]
j = j + 1
@@ -831,7 +835,8 @@ class coverage:
def morf_name_compare(self, x, y):
return cmp(self.morf_name(x), self.morf_name(y))
- def report(self, morfs, show_missing=1, ignore_errors=0, file=None, omit_prefixes=[]):
+ def report(self, morfs, show_missing=1, ignore_errors=0, file=None,
+ omit_prefixes=[]):
if not isinstance(morfs, types.ListType):
morfs = [morfs]
# On windows, the shell doesn't expand wildcards. Do it here.
@@ -898,19 +903,23 @@ class coverage:
blank_re = re.compile(r"\s*(#|$)")
else_re = re.compile(r"\s*else\s*:\s*(#|$)")
- def annotate(self, morfs, directory=None, ignore_errors=0, omit_prefixes=[]):
+ def annotate(self, morfs, directory=None, ignore_errors=0,
+ omit_prefixes=[]):
morfs = self.filter_by_prefix(morfs, omit_prefixes)
for morf in morfs:
try:
- filename, statements, excluded, missing, _ = self.analysis2(morf)
- self.annotate_file(filename, statements, excluded, missing, directory)
+ (filename, statements, excluded,
+ missing, _) = self.analysis2(morf)
+ self.annotate_file(filename, statements, excluded, missing,
+ directory)
except KeyboardInterrupt:
raise
except:
if not ignore_errors:
raise
- def annotate_file(self, filename, statements, excluded, missing, directory=None):
+ def annotate_file(self, filename, statements, excluded, missing,
+ directory=None):
source = open(filename, 'r')
if directory:
dest_file = os.path.join(directory,
diff --git a/tests/etree13/ElementTree.py b/tests/etree13/ElementTree.py
index d3732504..f459c7f8 100644
--- a/tests/etree13/ElementTree.py
+++ b/tests/etree13/ElementTree.py
@@ -1425,12 +1425,16 @@ class XMLParser(object):
err.position = value.lineno, value.offset
raise err
- def _fixtext(self, text):
- # convert text string to ascii, if possible
- try:
- return text.encode("ascii")
- except UnicodeError:
+ if sys.version_info >= (3, 0):
+ def _fixtext(self, text):
return text
+ else:
+ def _fixtext(self, text):
+ # convert text string to ascii, if possible
+ try:
+ return text.encode("ascii")
+ except UnicodeError:
+ return text
def _fixname(self, key):
# expand qname, and convert name string to ascii, if possible
diff --git a/tests/path.py b/tests/path.py
index ceb895f5..8e9afeaa 100644
--- a/tests/path.py
+++ b/tests/path.py
@@ -1,953 +1,196 @@
-""" path.py - An object representing a path to a file or directory.
-
-Example:
-
-from path import path
-d = path('/home/guido/bin')
-for f in d.files('*.py'):
- f.chmod(0755)
-
-This module requires Python 2.2 or later.
-
-
-URL: http://www.jorendorff.com/articles/python/path
-Author: Jason Orendorff <jason.orendorff\x40gmail\x2ecom> (and others - see the url!)
-Date: 9 Mar 2007
+#!/usr/bin/env python
+# coding: utf-8
"""
+ path
+ ~~~~
+ :copyright: Copyright 2010 by the Sphinx team, see AUTHORS.
+ :license: BSD, see LICENSE for details.
+"""
+import os
+import sys
+import shutil
+from codecs import open
-# TODO
-# - Tree-walking functions don't avoid symlink loops. Matt Harrison
-# sent me a patch for this.
-# - Bug in write_text(). It doesn't support Universal newline mode.
-# - Better error message in listdir() when self isn't a
-# directory. (On Windows, the error message really sucks.)
-# - Make sure everything has a good docstring.
-# - Add methods for regex find and replace.
-# - guess_content_type() method?
-# - Perhaps support arguments to touch().
-
-from __future__ import generators
-
-import sys, warnings, os, fnmatch, glob, shutil, codecs
-
-__version__ = '2.2'
-__all__ = ['path']
-
-# Platform-specific support for path.owner
-if os.name == 'nt':
- try:
- import win32security
- except ImportError:
- win32security = None
-else:
- try:
- import pwd
- except ImportError:
- pwd = None
-
-# Pre-2.3 support. Are unicode filenames supported?
-_base = str
-_getcwd = os.getcwd
-try:
- if os.path.supports_unicode_filenames:
- _base = unicode
- _getcwd = os.getcwdu
-except AttributeError:
- pass
-
-# Pre-2.3 workaround for booleans
-try:
- True, False
-except NameError:
- True, False = 1, 0
-
-# Pre-2.3 workaround for basestring.
-try:
- basestring
-except NameError:
- basestring = (str, unicode)
-
-# Universal newline support
-_textmode = 'r'
-if hasattr(file, 'newlines'):
- _textmode = 'U'
-
-
-class TreeWalkWarning(Warning):
- pass
-
-class path(_base):
- """ Represents a filesystem path.
-
- For documentation on individual methods, consult their
- counterparts in os.path.
- """
-
- # --- Special Python methods.
- def __repr__(self):
- return 'path(%s)' % _base.__repr__(self)
+FILESYSTEMENCODING = sys.getfilesystemencoding() or sys.getdefaultencoding()
- # Adding a path and a string yields a path.
- def __add__(self, more):
- try:
- resultStr = _base.__add__(self, more)
- except TypeError: #Python bug
- resultStr = NotImplemented
- if resultStr is NotImplemented:
- return resultStr
- return self.__class__(resultStr)
-
- def __radd__(self, other):
- if isinstance(other, basestring):
- return self.__class__(other.__add__(self))
- else:
- return NotImplemented
- # The / operator joins paths.
- def __div__(self, rel):
- """ fp.__div__(rel) == fp / rel == fp.joinpath(rel)
+class path(str):
+ """
+ Represents a path which behaves like a string.
+ """
+ if sys.version_info < (3, 0):
+ def __new__(cls, s, encoding=FILESYSTEMENCODING, errors='strict'):
+ if isinstance(s, unicode):
+ s = s.encode(encoding, errors=errors)
+ return str.__new__(cls, s)
+ return str.__new__(cls, s)
- Join two path components, adding a separator character if
- needed.
+ @property
+ def parent(self):
"""
- return self.__class__(os.path.join(self, rel))
-
- # Make the / operator work even when true division is enabled.
- __truediv__ = __div__
-
- def getcwd(cls):
- """ Return the current working directory as a path object. """
- return cls(_getcwd())
- getcwd = classmethod(getcwd)
-
-
- # --- Operations on path strings.
-
- isabs = os.path.isabs
- def abspath(self): return self.__class__(os.path.abspath(self))
- def normcase(self): return self.__class__(os.path.normcase(self))
- def normpath(self): return self.__class__(os.path.normpath(self))
- def realpath(self): return self.__class__(os.path.realpath(self))
- def expanduser(self): return self.__class__(os.path.expanduser(self))
- def expandvars(self): return self.__class__(os.path.expandvars(self))
- def dirname(self): return self.__class__(os.path.dirname(self))
- basename = os.path.basename
-
- def expand(self):
- """ Clean up a filename by calling expandvars(),
- expanduser(), and normpath() on it.
-
- This is commonly everything needed to clean up a filename
- read from a configuration file, for example.
+ The name of the directory the file or directory is in.
"""
- return self.expandvars().expanduser().normpath()
-
- def _get_namebase(self):
- base, ext = os.path.splitext(self.name)
- return base
-
- def _get_ext(self):
- f, ext = os.path.splitext(_base(self))
- return ext
-
- def _get_drive(self):
- drive, r = os.path.splitdrive(self)
- return self.__class__(drive)
-
- parent = property(
- dirname, None, None,
- """ This path's parent directory, as a new path object.
-
- For example, path('/usr/local/lib/libpython.so').parent == path('/usr/local/lib')
- """)
-
- name = property(
- basename, None, None,
- """ The name of this file or directory without the full path.
-
- For example, path('/usr/local/lib/libpython.so').name == 'libpython.so'
- """)
+ return self.__class__(os.path.dirname(self))
- namebase = property(
- _get_namebase, None, None,
- """ The same as path.name, but with one file extension stripped off.
-
- For example, path('/home/guido/python.tar.gz').name == 'python.tar.gz',
- but path('/home/guido/python.tar.gz').namebase == 'python.tar'
- """)
-
- ext = property(
- _get_ext, None, None,
- """ The file extension, for example '.py'. """)
-
- drive = property(
- _get_drive, None, None,
- """ The drive specifier, for example 'C:'.
- This is always empty on systems that don't use drive specifiers.
- """)
-
- def splitpath(self):
- """ p.splitpath() -> Return (p.parent, p.name). """
- parent, child = os.path.split(self)
- return self.__class__(parent), child
-
- def splitdrive(self):
- """ p.splitdrive() -> Return (p.drive, <the rest of p>).
-
- Split the drive specifier from this path. If there is
- no drive specifier, p.drive is empty, so the return value
- is simply (path(''), p). This is always the case on Unix.
+ def abspath(self):
"""
- drive, rel = os.path.splitdrive(self)
- return self.__class__(drive), rel
-
- def splitext(self):
- """ p.splitext() -> Return (p.stripext(), p.ext).
-
- Split the filename extension from this path and return
- the two parts. Either part may be empty.
-
- The extension is everything from '.' to the end of the
- last path segment. This has the property that if
- (a, b) == p.splitext(), then a + b == p.
+ Returns the absolute path.
"""
- filename, ext = os.path.splitext(self)
- return self.__class__(filename), ext
-
- def stripext(self):
- """ p.stripext() -> Remove one file extension from the path.
+ return self.__class__(os.path.abspath(self))
- For example, path('/home/guido/python.tar.gz').stripext()
- returns path('/home/guido/python.tar').
+ def isabs(self):
"""
- return self.splitext()[0]
-
- if hasattr(os.path, 'splitunc'):
- def splitunc(self):
- unc, rest = os.path.splitunc(self)
- return self.__class__(unc), rest
-
- def _get_uncshare(self):
- unc, r = os.path.splitunc(self)
- return self.__class__(unc)
-
- uncshare = property(
- _get_uncshare, None, None,
- """ The UNC mount point for this path.
- This is empty for paths on local drives. """)
-
- def joinpath(self, *args):
- """ Join two or more path components, adding a separator
- character (os.sep) if needed. Returns a new path
- object.
- """
- return self.__class__(os.path.join(self, *args))
-
- def splitall(self):
- r""" Return a list of the path components in this path.
-
- The first item in the list will be a path. Its value will be
- either os.curdir, os.pardir, empty, or the root directory of
- this path (for example, '/' or 'C:\\'). The other items in
- the list will be strings.
-
- path.path.joinpath(*result) will yield the original path.
- """
- parts = []
- loc = self
- while loc != os.curdir and loc != os.pardir:
- prev = loc
- loc, child = prev.splitpath()
- if loc == prev:
- break
- parts.append(child)
- parts.append(loc)
- parts.reverse()
- return parts
-
- def relpath(self):
- """ Return this path as a relative path,
- based from the current working directory.
- """
- cwd = self.__class__(os.getcwd())
- return cwd.relpathto(self)
-
- def relpathto(self, dest):
- """ Return a relative path from self to dest.
-
- If there is no relative path from self to dest, for example if
- they reside on different drives in Windows, then this returns
- dest.abspath().
- """
- origin = self.abspath()
- dest = self.__class__(dest).abspath()
-
- orig_list = origin.normcase().splitall()
- # Don't normcase dest! We want to preserve the case.
- dest_list = dest.splitall()
-
- if orig_list[0] != os.path.normcase(dest_list[0]):
- # Can't get here from there.
- return dest
-
- # Find the location where the two paths start to differ.
- i = 0
- for start_seg, dest_seg in zip(orig_list, dest_list):
- if start_seg != os.path.normcase(dest_seg):
- break
- i += 1
-
- # Now i is the point where the two paths diverge.
- # Need a certain number of "os.pardir"s to work up
- # from the origin to the point of divergence.
- segments = [os.pardir] * (len(orig_list) - i)
- # Need to add the diverging part of dest_list.
- segments += dest_list[i:]
- if len(segments) == 0:
- # If they happen to be identical, use os.curdir.
- relpath = os.curdir
- else:
- relpath = os.path.join(*segments)
- return self.__class__(relpath)
-
- # --- Listing, searching, walking, and matching
-
- def listdir(self, pattern=None):
- """ D.listdir() -> List of items in this directory.
-
- Use D.files() or D.dirs() instead if you want a listing
- of just files or just subdirectories.
+ Returns ``True`` if the path is absolute.
+ """
+ return os.path.isabs(self)
- The elements of the list are path objects.
+ def isdir(self):
+ """
+ Returns ``True`` if the path is a directory.
+ """
+ return os.path.isdir(self)
- With the optional 'pattern' argument, this only lists
- items whose names match the given pattern.
+ def isfile(self):
"""
- names = os.listdir(self)
- if pattern is not None:
- names = fnmatch.filter(names, pattern)
- return [self / child for child in names]
+ Returns ``True`` if the path is a file.
+ """
+ return os.path.isfile(self)
- def dirs(self, pattern=None):
- """ D.dirs() -> List of this directory's subdirectories.
+ def islink(self):
+ """
+ Returns ``True`` if the path is a symbolic link.
+ """
+ return os.path.islink(self)
- The elements of the list are path objects.
- This does not walk recursively into subdirectories
- (but see path.walkdirs).
+ def ismount(self):
+ """
+ Returns ``True`` if the path is a mount point.
+ """
+ return os.path.ismount(self)
- With the optional 'pattern' argument, this only lists
- directories whose names match the given pattern. For
- example, d.dirs('build-*').
+ def rmtree(self, ignore_errors=False, onerror=None):
"""
- return [p for p in self.listdir(pattern) if p.isdir()]
+ Removes the file or directory and any files or directories it may
+ contain.
- def files(self, pattern=None):
- """ D.files() -> List of the files in this directory.
+ :param ignore_errors:
+ If ``True`` errors are silently ignored, otherwise an exception
+ is raised in case an error occurs.
- The elements of the list are path objects.
- This does not walk into subdirectories (see path.walkfiles).
+ :param onerror:
+ A callback which gets called with the arguments `func`, `path` and
+ `exc_info`. `func` is one of :func:`os.listdir`, :func:`os.remove`
+ or :func:`os.rmdir`. `path` is the argument to the function which
+ caused it to fail and `exc_info` is a tuple as returned by
+ :func:`sys.exc_info`.
+ """
+ shutil.rmtree(self, ignore_errors=ignore_errors, onerror=onerror)
- With the optional 'pattern' argument, this only lists files
- whose names match the given pattern. For example,
- d.files('*.pyc').
+ def copytree(self, destination, symlinks=False):
"""
+ Recursively copy a directory to the given `destination`. If the given
+ `destination` does not exist it will be created.
- return [p for p in self.listdir(pattern) if p.isfile()]
+ :param symlinks:
+ If ``True`` symbolic links in the source tree result in symbolic
+ links in the destination tree otherwise the contents of the files
+ pointed to by the symbolic links are copied.
+ """
+ shutil.copytree(self, destination, symlinks=symlinks)
- def walk(self, pattern=None, errors='strict'):
- """ D.walk() -> iterator over files and subdirs, recursively.
+ def movetree(self, destination):
+ """
+ Recursively move the file or directory to the given `destination`
+ similar to the Unix "mv" command.
- The iterator yields path objects naming each child item of
- this directory and its descendants. This requires that
- D.isdir().
+ If the `destination` is a file it may be overwritten depending on the
+ :func:`os.rename` semantics.
+ """
+ shutil.move(self, destination)
- This performs a depth-first traversal of the directory tree.
- Each directory is returned just before all its children.
+ move = movetree
- The errors= keyword argument controls behavior when an
- error occurs. The default is 'strict', which causes an
- exception. The other allowed values are 'warn', which
- reports the error via warnings.warn(), and 'ignore'.
+ def unlink(self):
"""
- if errors not in ('strict', 'warn', 'ignore'):
- raise ValueError("invalid errors parameter")
-
- try:
- childList = self.listdir()
- except Exception:
- if errors == 'ignore':
- return
- elif errors == 'warn':
- warnings.warn(
- "Unable to list directory '%s': %s"
- % (self, sys.exc_info()[1]),
- TreeWalkWarning)
- return
- else:
- raise
-
- for child in childList:
- if pattern is None or child.fnmatch(pattern):
- yield child
- try:
- isdir = child.isdir()
- except Exception:
- if errors == 'ignore':
- isdir = False
- elif errors == 'warn':
- warnings.warn(
- "Unable to access '%s': %s"
- % (child, sys.exc_info()[1]),
- TreeWalkWarning)
- isdir = False
- else:
- raise
-
- if isdir:
- for item in child.walk(pattern, errors):
- yield item
-
- def walkdirs(self, pattern=None, errors='strict'):
- """ D.walkdirs() -> iterator over subdirs, recursively.
-
- With the optional 'pattern' argument, this yields only
- directories whose names match the given pattern. For
- example, mydir.walkdirs('*test') yields only directories
- with names ending in 'test'.
-
- The errors= keyword argument controls behavior when an
- error occurs. The default is 'strict', which causes an
- exception. The other allowed values are 'warn', which
- reports the error via warnings.warn(), and 'ignore'.
- """
- if errors not in ('strict', 'warn', 'ignore'):
- raise ValueError("invalid errors parameter")
+ Removes a file.
+ """
+ os.unlink(self)
+ def write_text(self, text, **kwargs):
+ """
+ Writes the given `text` to the file.
+ """
+ f = open(self, 'w', **kwargs)
try:
- dirs = self.dirs()
- except Exception:
- if errors == 'ignore':
- return
- elif errors == 'warn':
- warnings.warn(
- "Unable to list directory '%s': %s"
- % (self, sys.exc_info()[1]),
- TreeWalkWarning)
- return
- else:
- raise
-
- for child in dirs:
- if pattern is None or child.fnmatch(pattern):
- yield child
- for subsubdir in child.walkdirs(pattern, errors):
- yield subsubdir
-
- def walkfiles(self, pattern=None, errors='strict'):
- """ D.walkfiles() -> iterator over files in D, recursively.
-
- The optional argument, pattern, limits the results to files
- with names that match the pattern. For example,
- mydir.walkfiles('*.tmp') yields only files with the .tmp
- extension.
- """
- if errors not in ('strict', 'warn', 'ignore'):
- raise ValueError("invalid errors parameter")
+ f.write(text)
+ finally:
+ f.close()
+ def text(self, **kwargs):
+ """
+ Returns the text in the file.
+ """
+ f = open(self, mode='U', **kwargs)
try:
- childList = self.listdir()
- except Exception:
- if errors == 'ignore':
- return
- elif errors == 'warn':
- warnings.warn(
- "Unable to list directory '%s': %s"
- % (self, sys.exc_info()[1]),
- TreeWalkWarning)
- return
- else:
- raise
-
- for child in childList:
- try:
- isfile = child.isfile()
- isdir = not isfile and child.isdir()
- except:
- if errors == 'ignore':
- continue
- elif errors == 'warn':
- warnings.warn(
- "Unable to access '%s': %s"
- % (self, sys.exc_info()[1]),
- TreeWalkWarning)
- continue
- else:
- raise
-
- if isfile:
- if pattern is None or child.fnmatch(pattern):
- yield child
- elif isdir:
- for f in child.walkfiles(pattern, errors):
- yield f
-
- def fnmatch(self, pattern):
- """ Return True if self.name matches the given pattern.
-
- pattern - A filename pattern with wildcards,
- for example '*.py'.
- """
- return fnmatch.fnmatch(self.name, pattern)
-
- def glob(self, pattern):
- """ Return a list of path objects that match the pattern.
-
- pattern - a path relative to this directory, with wildcards.
-
- For example, path('/users').glob('*/bin/*') returns a list
- of all the files users have in their bin directories.
- """
- cls = self.__class__
- return [cls(s) for s in glob.glob(_base(self / pattern))]
-
-
- # --- Reading or writing an entire file at once.
-
- def open(self, mode='r'):
- """ Open this file. Return a file object. """
- return file(self, mode)
+ return f.read()
+ finally:
+ f.close()
def bytes(self):
- """ Open this file, read all bytes, return them as a string. """
- f = self.open('rb')
+ """
+ Returns the bytes in the file.
+ """
+ f = open(self, mode='rb')
try:
return f.read()
finally:
f.close()
def write_bytes(self, bytes, append=False):
- """ Open this file and write the given bytes to it.
+ """
+ Writes the given `bytes` to the file.
- Default behavior is to overwrite any existing file.
- Call p.write_bytes(bytes, append=True) to append instead.
+ :param append:
+ If ``True`` given `bytes` are added at the end of the file.
"""
if append:
mode = 'ab'
else:
mode = 'wb'
- f = self.open(mode)
+ f = open(self, mode=mode)
try:
f.write(bytes)
finally:
f.close()
- def text(self, encoding=None, errors='strict'):
- r""" Open this file, read it in, return the content as a string.
-
- This uses 'U' mode in Python 2.3 and later, so '\r\n' and '\r'
- are automatically translated to '\n'.
-
- Optional arguments:
-
- encoding - The Unicode encoding (or character set) of
- the file. If present, the content of the file is
- decoded and returned as a unicode object; otherwise
- it is returned as an 8-bit str.
- errors - How to handle Unicode errors; see help(str.decode)
- for the options. Default is 'strict'.
+ def exists(self):
"""
- if encoding is None:
- # 8-bit
- f = self.open(_textmode)
- try:
- return f.read()
- finally:
- f.close()
- else:
- # Unicode
- f = codecs.open(self, 'r', encoding, errors)
- # (Note - Can't use 'U' mode here, since codecs.open
- # doesn't support 'U' mode, even in Python 2.3.)
- try:
- t = f.read()
- finally:
- f.close()
- return (t.replace(u'\r\n', u'\n')
- .replace(u'\r\x85', u'\n')
- .replace(u'\r', u'\n')
- .replace(u'\x85', u'\n')
- .replace(u'\u2028', u'\n'))
-
- def write_text(self, text, encoding=None, errors='strict', linesep=os.linesep, append=False):
- r""" Write the given text to this file.
-
- The default behavior is to overwrite any existing file;
- to append instead, use the 'append=True' keyword argument.
-
- There are two differences between path.write_text() and
- path.write_bytes(): newline handling and Unicode handling.
- See below.
-
- Parameters:
-
- - text - str/unicode - The text to be written.
-
- - encoding - str - The Unicode encoding that will be used.
- This is ignored if 'text' isn't a Unicode string.
-
- - errors - str - How to handle Unicode encoding errors.
- Default is 'strict'. See help(unicode.encode) for the
- options. This is ignored if 'text' isn't a Unicode
- string.
-
- - linesep - keyword argument - str/unicode - The sequence of
- characters to be used to mark end-of-line. The default is
- os.linesep. You can also specify None; this means to
- leave all newlines as they are in 'text'.
-
- - append - keyword argument - bool - Specifies what to do if
- the file already exists (True: append to the end of it;
- False: overwrite it.) The default is False.
-
-
- --- Newline handling.
-
- write_text() converts all standard end-of-line sequences
- ('\n', '\r', and '\r\n') to your platform's default end-of-line
- sequence (see os.linesep; on Windows, for example, the
- end-of-line marker is '\r\n').
-
- If you don't like your platform's default, you can override it
- using the 'linesep=' keyword argument. If you specifically want
- write_text() to preserve the newlines as-is, use 'linesep=None'.
-
- This applies to Unicode text the same as to 8-bit text, except
- there are three additional standard Unicode end-of-line sequences:
- u'\x85', u'\r\x85', and u'\u2028'.
-
- (This is slightly different from when you open a file for
- writing with fopen(filename, "w") in C or file(filename, 'w')
- in Python.)
-
-
- --- Unicode
-
- If 'text' isn't Unicode, then apart from newline handling, the
- bytes are written verbatim to the file. The 'encoding' and
- 'errors' arguments are not used and must be omitted.
-
- If 'text' is Unicode, it is first converted to bytes using the
- specified 'encoding' (or the default encoding if 'encoding'
- isn't specified). The 'errors' argument applies only to this
- conversion.
-
- """
- if isinstance(text, unicode):
- if linesep is not None:
- # Convert all standard end-of-line sequences to
- # ordinary newline characters.
- text = (text.replace(u'\r\n', u'\n')
- .replace(u'\r\x85', u'\n')
- .replace(u'\r', u'\n')
- .replace(u'\x85', u'\n')
- .replace(u'\u2028', u'\n'))
- text = text.replace(u'\n', linesep)
- if encoding is None:
- encoding = sys.getdefaultencoding()
- bytes = text.encode(encoding, errors)
- else:
- # It is an error to specify an encoding if 'text' is
- # an 8-bit string.
- assert encoding is None
-
- if linesep is not None:
- text = (text.replace('\r\n', '\n')
- .replace('\r', '\n'))
- bytes = text.replace('\n', linesep)
-
- self.write_bytes(bytes, append)
-
- def lines(self, encoding=None, errors='strict', retain=True):
- r""" Open this file, read all lines, return them in a list.
-
- Optional arguments:
- encoding - The Unicode encoding (or character set) of
- the file. The default is None, meaning the content
- of the file is read as 8-bit characters and returned
- as a list of (non-Unicode) str objects.
- errors - How to handle Unicode errors; see help(str.decode)
- for the options. Default is 'strict'
- retain - If true, retain newline characters; but all newline
- character combinations ('\r', '\n', '\r\n') are
- translated to '\n'. If false, newline characters are
- stripped off. Default is True.
-
- This uses 'U' mode in Python 2.3 and later.
- """
- if encoding is None and retain:
- f = self.open(_textmode)
- try:
- return f.readlines()
- finally:
- f.close()
- else:
- return self.text(encoding, errors).splitlines(retain)
-
- def write_lines(self, lines, encoding=None, errors='strict',
- linesep=os.linesep, append=False):
- r""" Write the given lines of text to this file.
-
- By default this overwrites any existing file at this path.
-
- This puts a platform-specific newline sequence on every line.
- See 'linesep' below.
-
- lines - A list of strings.
-
- encoding - A Unicode encoding to use. This applies only if
- 'lines' contains any Unicode strings.
-
- errors - How to handle errors in Unicode encoding. This
- also applies only to Unicode strings.
-
- linesep - The desired line-ending. This line-ending is
- applied to every line. If a line already has any
- standard line ending ('\r', '\n', '\r\n', u'\x85',
- u'\r\x85', u'\u2028'), that will be stripped off and
- this will be used instead. The default is os.linesep,
- which is platform-dependent ('\r\n' on Windows, '\n' on
- Unix, etc.) Specify None to write the lines as-is,
- like file.writelines().
-
- Use the keyword argument append=True to append lines to the
- file. The default is to overwrite the file. Warning:
- When you use this with Unicode data, if the encoding of the
- existing data in the file is different from the encoding
- you specify with the encoding= parameter, the result is
- mixed-encoding data, which can really confuse someone trying
- to read the file later.
+ Returns ``True`` if the path exist.
"""
- if append:
- mode = 'ab'
- else:
- mode = 'wb'
- f = self.open(mode)
- try:
- for line in lines:
- isUnicode = isinstance(line, unicode)
- if linesep is not None:
- # Strip off any existing line-end and add the
- # specified linesep string.
- if isUnicode:
- if line[-2:] in (u'\r\n', u'\x0d\x85'):
- line = line[:-2]
- elif line[-1:] in (u'\r', u'\n',
- u'\x85', u'\u2028'):
- line = line[:-1]
- else:
- if line[-2:] == '\r\n':
- line = line[:-2]
- elif line[-1:] in ('\r', '\n'):
- line = line[:-1]
- line += linesep
- if isUnicode:
- if encoding is None:
- encoding = sys.getdefaultencoding()
- line = line.encode(encoding, errors)
- f.write(line)
- finally:
- f.close()
-
- # --- Methods for querying the filesystem.
-
- exists = os.path.exists
- isdir = os.path.isdir
- isfile = os.path.isfile
- islink = os.path.islink
- ismount = os.path.ismount
-
- if hasattr(os.path, 'samefile'):
- samefile = os.path.samefile
-
- getatime = os.path.getatime
- atime = property(
- getatime, None, None,
- """ Last access time of the file. """)
-
- getmtime = os.path.getmtime
- mtime = property(
- getmtime, None, None,
- """ Last-modified time of the file. """)
-
- if hasattr(os.path, 'getctime'):
- getctime = os.path.getctime
- ctime = property(
- getctime, None, None,
- """ Creation time of the file. """)
-
- getsize = os.path.getsize
- size = property(
- getsize, None, None,
- """ Size of the file, in bytes. """)
-
- if hasattr(os, 'access'):
- def access(self, mode):
- """ Return true if current user has access to this path.
-
- mode - One of the constants os.F_OK, os.R_OK, os.W_OK, os.X_OK
- """
- return os.access(self, mode)
-
- def stat(self):
- """ Perform a stat() system call on this path. """
- return os.stat(self)
-
- def lstat(self):
- """ Like path.stat(), but do not follow symbolic links. """
- return os.lstat(self)
-
- def get_owner(self):
- r""" Return the name of the owner of this file or directory.
-
- This follows symbolic links.
-
- On Windows, this returns a name of the form ur'DOMAIN\User Name'.
- On Windows, a group can own a file or directory.
- """
- if os.name == 'nt':
- if win32security is None:
- raise Exception("path.owner requires win32all to be installed")
- desc = win32security.GetFileSecurity(
- self, win32security.OWNER_SECURITY_INFORMATION)
- sid = desc.GetSecurityDescriptorOwner()
- account, domain, typecode = win32security.LookupAccountSid(None, sid)
- return domain + u'\\' + account
- else:
- if pwd is None:
- raise NotImplementedError("path.owner is not implemented on this platform.")
- st = self.stat()
- return pwd.getpwuid(st.st_uid).pw_name
-
- owner = property(
- get_owner, None, None,
- """ Name of the owner of this file or directory. """)
-
- if hasattr(os, 'statvfs'):
- def statvfs(self):
- """ Perform a statvfs() system call on this path. """
- return os.statvfs(self)
-
- if hasattr(os, 'pathconf'):
- def pathconf(self, name):
- return os.pathconf(self, name)
-
-
- # --- Modifying operations on files and directories
-
- def utime(self, times):
- """ Set the access and modified times of this file. """
- os.utime(self, times)
-
- def chmod(self, mode):
- os.chmod(self, mode)
+ return os.path.exists(self)
- if hasattr(os, 'chown'):
- def chown(self, uid, gid):
- os.chown(self, uid, gid)
-
- def rename(self, new):
- os.rename(self, new)
-
- def renames(self, new):
- os.renames(self, new)
-
-
- # --- Create/delete operations on directories
-
- def mkdir(self, mode=0777):
- os.mkdir(self, mode)
+ def lexists(self):
+ """
+ Returns ``True`` if the path exists unless it is a broken symbolic
+ link.
+ """
+ return os.path.lexists(self)
def makedirs(self, mode=0777):
+ """
+ Recursively create directories.
+ """
os.makedirs(self, mode)
- def rmdir(self):
- os.rmdir(self)
-
- def removedirs(self):
- os.removedirs(self)
-
-
- # --- Modifying operations on files
-
- def touch(self):
- """ Set the access/modified times of this file to the current time.
- Create the file if it does not exist.
+ def joinpath(self, *args):
"""
- fd = os.open(self, os.O_WRONLY | os.O_CREAT, 0666)
- os.close(fd)
- os.utime(self, None)
-
- def remove(self):
- os.remove(self)
-
- def unlink(self):
- os.unlink(self)
-
-
- # --- Links
-
- if hasattr(os, 'link'):
- def link(self, newpath):
- """ Create a hard link at 'newpath', pointing to this file. """
- os.link(self, newpath)
-
- if hasattr(os, 'symlink'):
- def symlink(self, newlink):
- """ Create a symbolic link at 'newlink', pointing here. """
- os.symlink(self, newlink)
-
- if hasattr(os, 'readlink'):
- def readlink(self):
- """ Return the path to which this symbolic link points.
-
- The result may be an absolute or a relative path.
- """
- return self.__class__(os.readlink(self))
-
- def readlinkabs(self):
- """ Return the path to which this symbolic link points.
-
- The result is always an absolute path.
- """
- p = self.readlink()
- if p.isabs():
- return p
- else:
- return (self.parent / p).abspath()
-
-
- # --- High-level functions from shutil
-
- copyfile = shutil.copyfile
- copymode = shutil.copymode
- copystat = shutil.copystat
- copy = shutil.copy
- copy2 = shutil.copy2
- copytree = shutil.copytree
- if hasattr(shutil, 'move'):
- move = shutil.move
- rmtree = shutil.rmtree
-
-
- # --- Special stuff from os
-
- if hasattr(os, 'chroot'):
- def chroot(self):
- os.chroot(self)
+ Joins the path with the argument given and returns the result.
+ """
+ return self.__class__(os.path.join(self, *map(self.__class__, args)))
- if hasattr(os, 'startfile'):
- def startfile(self):
- os.startfile(self)
+ __div__ = __truediv__ = joinpath
+ def __repr__(self):
+ return '%s(%s)' % (self.__class__.__name__, str.__repr__(self))
diff --git a/tests/root/autosummary.txt b/tests/root/autosummary.txt
index edf75e32..fc1a35a0 100644
--- a/tests/root/autosummary.txt
+++ b/tests/root/autosummary.txt
@@ -4,4 +4,28 @@ Autosummary test
.. autosummary::
:toctree: generated
- sphinx.application.TemplateBridge
+ sphinx.application.Sphinx
+
+.. currentmodule:: sphinx.application
+
+.. autoclass:: TemplateBridge
+
+ Basic test
+
+ .. autosummary::
+
+ render -- some ignored stuff goes here
+ render_string More ignored stuff
+
+ Test with tildes
+
+ .. autosummary::
+
+ ~TemplateBridge.render
+ ~TemplateBridge.render_string
+
+ Methods:
+
+ .. automethod:: render
+
+ .. automethod:: render_string
diff --git a/tests/root/bom.po b/tests/root/bom.po
new file mode 100644
index 00000000..c6025eb1
--- /dev/null
+++ b/tests/root/bom.po
@@ -0,0 +1,12 @@
+#, fuzzy
+msgid ""
+msgstr ""
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+msgid "File with UTF-8 BOM"
+msgstr "Datei mit UTF-8"
+
+msgid "This file has a UTF-8 \"BOM\"."
+msgstr "This file has umlauts: äöü."
diff --git a/tests/root/conf.py b/tests/root/conf.py
index a50029e5..b97ddfcc 100644
--- a/tests/root/conf.py
+++ b/tests/root/conf.py
@@ -22,7 +22,7 @@ copyright = '2010, Georg Brandl & Team'
version = '0.6'
release = '0.6alpha1'
today_fmt = '%B %d, %Y'
-#unused_docs = []
+# unused_docs = []
exclude_patterns = ['_build', '**/excluded.*']
keep_warnings = True
pygments_style = 'sphinx'
@@ -49,6 +49,11 @@ latex_documents = [
latex_additional_files = ['svgimg.svg']
+texinfo_documents = [
+ ('contents', 'SphinxTests', 'Sphinx Tests',
+ 'Georg Brandl \\and someone else', 'Sphinx Testing', 'Miscellaneous'),
+]
+
value_from_conf_py = 84
coverage_c_path = ['special/*.h']
diff --git a/tests/root/contents.txt b/tests/root/contents.txt
index e052e04b..280953b4 100644
--- a/tests/root/contents.txt
+++ b/tests/root/contents.txt
@@ -26,6 +26,7 @@ Contents:
extensions
doctest
extensions
+ versioning/index
Python <http://python.org/>
diff --git a/tests/root/doctest.txt b/tests/root/doctest.txt
index 35cdd589..d029cd88 100644
--- a/tests/root/doctest.txt
+++ b/tests/root/doctest.txt
@@ -30,7 +30,7 @@ Special directives
.. testcode::
- print 1+1
+ print(1+1)
.. testoutput::
@@ -50,30 +50,31 @@ Special directives
.. testsetup:: *
- from math import floor
+ def squared(x):
+ return x * x
.. doctest::
- >>> floor(1.2)
- 1.0
+ >>> squared(2)
+ 4
.. testcode::
- print floor(1.2)
+ print(squared(2))
.. testoutput::
- 1.0
+ 4
- >>> floor(1.2)
- 1.0
+ >>> squared(2)
+ 4
* options for testcode/testoutput blocks
.. testcode::
:hide:
- print 'Output text.'
+ print('Output text.')
.. testoutput::
:hide:
@@ -85,36 +86,44 @@ Special directives
.. testsetup:: group1
- from math import ceil
+ def add(x, y):
+ return x + y
- ``ceil`` is now known in "group1", but not in others.
+
+ ``add`` is now known in "group1", but not in others.
.. doctest:: group1
- >>> ceil(0.8)
- 1.0
+ >>> add(1, 1)
+ 2
.. doctest:: group2
- >>> ceil(0.8)
+ >>> add(1, 1)
Traceback (most recent call last):
...
- NameError: name 'ceil' is not defined
+ NameError: name 'add' is not defined
Interleaving testcode/testoutput:
.. testcode:: group1
- print ceil(0.8)
+ print(squared(3))
.. testcode:: group2
- print floor(0.8)
+ print(squared(4))
.. testoutput:: group1
- 1.0
+ 9
.. testoutput:: group2
- 0.0
+ 16
+
+
+.. testcleanup:: *
+
+ import test_doctest
+ test_doctest.cleanup_call()
diff --git a/tests/root/literal.inc b/tests/root/literal.inc
index d5b9890c..694f15ed 100644
--- a/tests/root/literal.inc
+++ b/tests/root/literal.inc
@@ -1,7 +1,7 @@
# Literally included file using Python highlighting
# -*- coding: utf-8 -*-
-foo = u"Including Unicode characters: üöä"
+foo = "Including Unicode characters: üöä"
class Foo:
pass
diff --git a/tests/root/markup.txt b/tests/root/markup.txt
index 1dd86160..dde13a6b 100644
--- a/tests/root/markup.txt
+++ b/tests/root/markup.txt
@@ -142,6 +142,8 @@ Adding \n to test unescaping.
Test :abbr:`abbr (abbreviation)` and another :abbr:`abbr (abbreviation)`.
+Testing the :index:`index` role, also available with
+:index:`explicit <pair: title; explicit>` title.
.. _with:
@@ -167,6 +169,18 @@ Tables
| 2 | Empty cells: | |
+----+----------------+----+
+Table with multicol:
+
+.. only:: latex
+
+ +----+---------------------+
+ | 1 | test! |
+ +----+---------+------+----+
+ | 2 | col | col | c |
+ | y +---------+------+----+
+ | x | test |
+ +----+---------------------+
+
Figures
-------
@@ -239,13 +253,25 @@ This tests :CLASS:`role names in uppercase`.
* Monty Python
.. glossary::
+ :sorted:
boson
Particle with integer spin.
- fermion
+ *fermion*
Particle with half-integer spin.
+ tauon
+ myon
+ electron
+ Examples for fermions.
+
+ über
+ Gewisse
+
+ änhlich
+ Dinge
+
.. productionlist::
try_stmt: `try1_stmt` | `try2_stmt`
try1_stmt: "try" ":" `suite`
@@ -265,6 +291,8 @@ Index markup
double: entry; double
triple: index; entry; triple
keyword: with
+ see: from; to
+ seealso: fromalso; toalso
Invalid index markup...
@@ -273,6 +301,11 @@ Invalid index markup...
pair:
keyword:
+.. index::
+ !Main, !Other
+ !single: entry; pair
+
+:index:`!Main`
.. _ölabel:
diff --git a/tests/root/subdir.po b/tests/root/subdir.po
new file mode 100644
index 00000000..f515f220
--- /dev/null
+++ b/tests/root/subdir.po
@@ -0,0 +1,9 @@
+#, fuzzy
+msgid ""
+msgstr ""
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+msgid "Including in subdir"
+msgstr "translation"
diff --git a/tests/root/versioning/added.txt b/tests/root/versioning/added.txt
new file mode 100644
index 00000000..22a70739
--- /dev/null
+++ b/tests/root/versioning/added.txt
@@ -0,0 +1,20 @@
+Versioning test text
+====================
+
+So the thing is I need some kind of text - not the lorem ipsum stuff, that
+doesn't work out that well - to test :mod:`sphinx.versioning`. I couldn't find
+a good text for that under public domain so I thought the easiest solution is
+to write one by myself. It's not really interesting, in fact it is *really*
+boring.
+
+Anyway I need more than one paragraph, at least three for the original
+document, I think, and another one for two different ones.
+
+So the previous paragraph was a bit short because I don't want to test this
+only on long paragraphs, I hope it was short enough to cover most stuff.
+Anyway I see this lacks ``some markup`` so I have to add a **little** bit.
+
+Woho another paragraph, if this test fails we really have a problem because
+this means the algorithm itself fails and not the diffing algorithm which is
+pretty much doomed anyway as it probably fails for some kind of language
+respecting certain nodes anyway but we can't work around that anyway.
diff --git a/tests/root/versioning/deleted.txt b/tests/root/versioning/deleted.txt
new file mode 100644
index 00000000..a1a9c4c9
--- /dev/null
+++ b/tests/root/versioning/deleted.txt
@@ -0,0 +1,12 @@
+Versioning test text
+====================
+
+So the thing is I need some kind of text - not the lorem ipsum stuff, that
+doesn't work out that well - to test :mod:`sphinx.versioning`. I couldn't find
+a good text for that under public domain so I thought the easiest solution is
+to write one by myself. It's not really interesting, in fact it is *really*
+boring.
+
+So the previous paragraph was a bit short because I don't want to test this
+only on long paragraphs, I hope it was short enough to cover most stuff.
+Anyway I see this lacks ``some markup`` so I have to add a **little** bit.
diff --git a/tests/root/versioning/deleted_end.txt b/tests/root/versioning/deleted_end.txt
new file mode 100644
index 00000000..f30e6300
--- /dev/null
+++ b/tests/root/versioning/deleted_end.txt
@@ -0,0 +1,11 @@
+Versioning test text
+====================
+
+So the thing is I need some kind of text - not the lorem ipsum stuff, that
+doesn't work out that well - to test :mod:`sphinx.versioning`. I couldn't find
+a good text for that under public domain so I thought the easiest solution is
+to write one by myself. It's not really interesting, in fact it is *really*
+boring.
+
+Anyway I need more than one paragraph, at least three for the original
+document, I think, and another one for two different ones.
diff --git a/tests/root/versioning/index.txt b/tests/root/versioning/index.txt
new file mode 100644
index 00000000..9d098f75
--- /dev/null
+++ b/tests/root/versioning/index.txt
@@ -0,0 +1,13 @@
+Versioning Stuff
+================
+
+.. toctree::
+
+ original
+ added
+ insert
+ deleted
+ deleted_end
+ modified
+ insert_beginning
+ insert_similar
diff --git a/tests/root/versioning/insert.txt b/tests/root/versioning/insert.txt
new file mode 100644
index 00000000..1c157cc9
--- /dev/null
+++ b/tests/root/versioning/insert.txt
@@ -0,0 +1,18 @@
+Versioning test text
+====================
+
+So the thing is I need some kind of text - not the lorem ipsum stuff, that
+doesn't work out that well - to test :mod:`sphinx.versioning`. I couldn't find
+a good text for that under public domain so I thought the easiest solution is
+to write one by myself. It's not really interesting, in fact it is *really*
+boring.
+
+So this paragraph is just something I inserted in this document to test if our
+algorithm notices that this paragraph is not just a changed version.
+
+Anyway I need more than one paragraph, at least three for the original
+document, I think, and another one for two different ones.
+
+So the previous paragraph was a bit short because I don't want to test this
+only on long paragraphs, I hope it was short enough to cover most stuff.
+Anyway I see this lacks ``some markup`` so I have to add a **little** bit.
diff --git a/tests/root/versioning/insert_beginning.txt b/tests/root/versioning/insert_beginning.txt
new file mode 100644
index 00000000..57102a76
--- /dev/null
+++ b/tests/root/versioning/insert_beginning.txt
@@ -0,0 +1,18 @@
+Versioning test text
+====================
+
+Apperantly inserting a paragraph at the beginning of a document caused
+problems earlier so this document should be used to test that.
+
+So the thing is I need some kind of text - not the lorem ipsum stuff, that
+doesn't work out that well - to test :mod:`sphinx.versioning`. I couldn't find
+a good text for that under public domain so I thought the easiest solution is
+to write one by myself. It's not really interesting, in fact it is *really*
+boring.
+
+Anyway I need more than one paragraph, at least three for the original
+document, I think, and another one for two different ones.
+
+So the previous paragraph was a bit short because I don't want to test this
+only on long paragraphs, I hope it was short enough to cover most stuff.
+Anyway I see this lacks ``some markup`` so I have to add a **little** bit.
diff --git a/tests/root/versioning/insert_similar.txt b/tests/root/versioning/insert_similar.txt
new file mode 100644
index 00000000..ee9b5305
--- /dev/null
+++ b/tests/root/versioning/insert_similar.txt
@@ -0,0 +1,17 @@
+Versioning test text
+====================
+
+So the thing is I need some kind of text - not the lorem ipsum stuff, that
+doesn't work out that well - to test :mod:`sphinx.versioning`. I couldn't find
+a good text for that under public domain so I thought the easiest solution is
+to write one by myself. It's not really interesting, in fact it is *really*
+boring.
+
+Anyway I need more
+
+Anyway I need more than one paragraph, at least three for the original
+document, I think, and another one for two different ones.
+
+So the previous paragraph was a bit short because I don't want to test this
+only on long paragraphs, I hope it was short enough to cover most stuff.
+Anyway I see this lacks ``some markup`` so I have to add a **little** bit.
diff --git a/tests/root/versioning/modified.txt b/tests/root/versioning/modified.txt
new file mode 100644
index 00000000..49cdad93
--- /dev/null
+++ b/tests/root/versioning/modified.txt
@@ -0,0 +1,17 @@
+Versioning test text
+====================
+
+So the thing is I need some kind of text - not the lorem ipsum stuff, that
+doesn't work out that well - to test :mod:`sphinx.versioning`. I couldn't find
+a good text for that under public domain so I thought the easiest solution is
+to write one by myself. Inserting something silly as a modification, btw. have
+you seen the typo below?. It's not really interesting, in fact it is *really*
+boring.
+
+Anyway I need more than one paragraph, at least three for the original
+document, I think, and another one for two different ones. So this is a small
+modification by adding something to this paragraph.
+
+So the previous paragraph was a bit short because I don't want to test this
+only on long paragraphs, I hoep it was short enough to cover most stuff.
+Anyway I see this lacks ``some markup`` so I have to add a **little** bit.
diff --git a/tests/root/versioning/original.txt b/tests/root/versioning/original.txt
new file mode 100644
index 00000000..b3fe0609
--- /dev/null
+++ b/tests/root/versioning/original.txt
@@ -0,0 +1,15 @@
+Versioning test text
+====================
+
+So the thing is I need some kind of text - not the lorem ipsum stuff, that
+doesn't work out that well - to test :mod:`sphinx.versioning`. I couldn't find
+a good text for that under public domain so I thought the easiest solution is
+to write one by myself. It's not really interesting, in fact it is *really*
+boring.
+
+Anyway I need more than one paragraph, at least three for the original
+document, I think, and another one for two different ones.
+
+So the previous paragraph was a bit short because I don't want to test this
+only on long paragraphs, I hope it was short enough to cover most stuff.
+Anyway I see this lacks ``some markup`` so I have to add a **little** bit.
diff --git a/tests/run.py b/tests/run.py
index 2e07982c..7d51c071 100755
--- a/tests/run.py
+++ b/tests/run.py
@@ -11,7 +11,17 @@
"""
import sys
-from os import path
+from os import path, chdir, listdir
+
+if sys.version_info >= (3, 0):
+ print('Copying and converting sources to build/lib/tests...')
+ from distutils.util import copydir_run_2to3
+ testroot = path.dirname(__file__) or '.'
+ newroot = path.join(testroot, path.pardir, 'build')
+ newroot = path.join(newroot, listdir(newroot)[0], 'tests')
+ copydir_run_2to3(testroot, newroot)
+ # switch to the converted dir so nose tests the right tests
+ chdir(newroot)
# always test the sphinx package from this directory
sys.path.insert(0, path.join(path.dirname(__file__), path.pardir))
@@ -19,8 +29,20 @@ sys.path.insert(0, path.join(path.dirname(__file__), path.pardir))
try:
import nose
except ImportError:
- print "The nose package is needed to run the Sphinx test suite."
+ print('The nose package is needed to run the Sphinx test suite.')
+ sys.exit(1)
+
+try:
+ import docutils
+except ImportError:
+ print('Sphinx requires the docutils package to be installed.')
+ sys.exit(1)
+
+try:
+ import jinja2
+except ImportError:
+ print('Sphinx requires the jinja2 package to be installed.')
sys.exit(1)
-print "Running Sphinx test suite..."
+print('Running Sphinx test suite...')
nose.main()
diff --git a/tests/test_application.py b/tests/test_application.py
index f68c22d7..4baabcec 100644
--- a/tests/test_application.py
+++ b/tests/test_application.py
@@ -45,9 +45,11 @@ def test_output():
app = TestApp(status=status, warning=warnings)
try:
status.truncate(0) # __init__ writes to status
+ status.seek(0)
app.info("Nothing here...")
assert status.getvalue() == "Nothing here...\n"
status.truncate(0)
+ status.seek(0)
app.info("Nothing here...", True)
assert status.getvalue() == "Nothing here..."
diff --git a/tests/test_autodoc.py b/tests/test_autodoc.py
index e8a7d29f..965064c3 100644
--- a/tests/test_autodoc.py
+++ b/tests/test_autodoc.py
@@ -10,6 +10,9 @@
:license: BSD, see LICENSE for details.
"""
+import sys
+from StringIO import StringIO
+
from util import *
from docutils.statemachine import ViewList
@@ -17,7 +20,6 @@ from docutils.statemachine import ViewList
from sphinx.ext.autodoc import AutoDirective, add_documenter, \
ModuleLevelDocumenter, FunctionDocumenter, cut_lines, between, ALL
-from StringIO import StringIO
def setup_module():
global app, lid, options, directive
@@ -32,6 +34,8 @@ def setup_module():
options = Struct(
inherited_members = False,
undoc_members = False,
+ private_members = False,
+ special_members = False,
show_inheritance = False,
noindex = False,
synopsis = '',
@@ -337,6 +341,7 @@ def test_generate():
inst = AutoDirective._registry[objtype](directive, name)
inst.generate(**kw)
assert directive.result
+ #print '\n'.join(directive.result)
assert len(_warnings) == 0, _warnings
del directive.result[:]
@@ -420,12 +425,16 @@ def test_generate():
('attribute', 'test_autodoc.Class.udocattr'),
('attribute', 'test_autodoc.Class.mdocattr'),
('attribute', 'test_autodoc.Class.inst_attr_comment'),
- ('attribute', 'test_autodoc.Class.inst_attr_string')
+ ('attribute', 'test_autodoc.Class.inst_attr_inline'),
+ ('attribute', 'test_autodoc.Class.inst_attr_string'),
+ ('method', 'test_autodoc.Class.moore'),
])
options.members = ALL
assert_processes(should, 'class', 'Class')
options.undoc_members = True
- should.append(('method', 'test_autodoc.Class.undocmeth'))
+ should.extend((('attribute', 'test_autodoc.Class.skipattr'),
+ ('method', 'test_autodoc.Class.undocmeth'),
+ ('method', 'test_autodoc.Class.roger')))
assert_processes(should, 'class', 'Class')
options.inherited_members = True
should.append(('method', 'test_autodoc.Class.inheritedmeth'))
@@ -488,6 +497,8 @@ def test_generate():
' .. py:attribute:: Class.docattr',
' .. py:attribute:: Class.udocattr',
' .. py:attribute:: Class.mdocattr',
+ ' .. py:classmethod:: Class.roger(a, e=5, f=6)',
+ ' .. py:classmethod:: Class.moore(a, e, f) -> happiness',
' .. py:attribute:: Class.inst_attr_comment',
' .. py:attribute:: Class.inst_attr_string',
' .. py:method:: Class.inheritedmeth()',
@@ -501,11 +512,34 @@ def test_generate():
'attribute', 'mdocattr')
del directive.env.temp_data['autodoc:class']
+ # test autodoc_docstring_signature
+ assert_result_contains(
+ '.. py:method:: DocstringSig.meth(FOO, BAR=1) -> BAZ', 'method',
+ 'test_autodoc.DocstringSig.meth')
+ assert_result_contains(
+ ' rest of docstring', 'method', 'test_autodoc.DocstringSig.meth')
+ assert_result_contains(
+ '.. py:classmethod:: Class.moore(a, e, f) -> happiness', 'method',
+ 'test_autodoc.Class.moore')
+
+ # test new attribute documenter behavior
+ directive.env.temp_data['py:module'] = 'test_autodoc'
+ options.undoc_members = True
+ assert_processes([('class', 'test_autodoc.AttCls'),
+ ('attribute', 'test_autodoc.AttCls.a1'),
+ ('attribute', 'test_autodoc.AttCls.a2'),
+ ], 'class', 'AttCls')
+ assert_result_contains(
+ ' :annotation: = hello world', 'attribute', 'AttCls.a1')
+ assert_result_contains(
+ ' :annotation: = None', 'attribute', 'AttCls.a2')
+
# --- generate fodder ------------
__all__ = ['Class']
+#: documentation for the integer
integer = 1
class CustomEx(Exception):
@@ -525,6 +559,21 @@ class CustomDataDescriptor(object):
return self
return 42
+def _funky_classmethod(name, b, c, d, docstring=None):
+ """Generates a classmethod for a class from a template by filling out
+ some arguments."""
+ def template(cls, a, b, c, d=4, e=5, f=6):
+ return a, b, c, d, e, f
+ if sys.version_info >= (2, 5):
+ from functools import partial
+ function = partial(template, b=b, c=c, d=d)
+ else:
+ def function(cls, a, e=5, f=6):
+ return template(a, b, c, d, e, f)
+ function.__name__ = name
+ function.__doc__ = docstring
+ return classmethod(function)
+
class Base(object):
def inheritedmeth(self):
"""Inherited function."""
@@ -567,7 +616,13 @@ class Class(Base):
mdocattr = StringIO()
"""should be documented as well - süß"""
+ roger = _funky_classmethod("roger", 2, 3, 4)
+
+ moore = _funky_classmethod("moore", 9, 8, 7,
+ docstring="moore(a, e, f) -> happiness")
+
def __init__(self, arg):
+ self.inst_attr_inline = None #: an inline documented instance attr
#: a documented instance attribute
self.inst_attr_comment = None
self.inst_attr_string = None
@@ -595,3 +650,20 @@ class Outer(object):
# should be documented as an alias
factory = dict
+
+
+class DocstringSig(object):
+ def meth(self):
+ """meth(FOO, BAR=1) -> BAZ
+First line of docstring
+
+ rest of docstring
+ """
+
+class StrRepr(str):
+ def __repr__(self):
+ return self
+
+class AttCls(object):
+ a1 = StrRepr('hello\nworld')
+ a2 = None
diff --git a/tests/test_autosummary.py b/tests/test_autosummary.py
index 0c0a8ff4..048940d0 100644
--- a/tests/test_autosummary.py
+++ b/tests/test_autosummary.py
@@ -9,8 +9,6 @@
:license: BSD, see LICENSE for details.
"""
-import string
-
from util import *
from sphinx.ext.autosummary import mangle_signature
@@ -25,9 +23,17 @@ def test_mangle_signature():
:: (a, b[, aaa, bbb, ccc, ...])
(a, b, c=(), d=<foo>) :: (a, b[, c, d])
(a, b, c='foobar()', d=123) :: (a, b[, c, d])
+ (a, b[, c]) :: (a, b[, c])
+ (a, b[, cxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx]) :: (a, b[, ...)
+ (a, b='c=d, e=f, g=h', c=3) :: (a[, b, c])
+ (a, b='c=d, \\'e=f,\\' g=h', c=3) :: (a[, b, c])
+ (a, b='c=d, ', e='\\\\' g=h, c=3) :: (a[, b, e, c])
+ (a, b={'c=d, ': 3, '\\\\': 3}) :: (a[, b])
+ (a=1, b=2, c=3) :: ([a, b, c])
+ (a=1, b=<SomeClass: a, b, c>, c=3) :: ([a, b, c])
"""
- TEST = [map(string.strip, x.split("::")) for x in TEST.split("\n")
+ TEST = [map(lambda x: x.strip(), x.split("::")) for x in TEST.split("\n")
if '::' in x]
for inp, outp in TEST:
res = mangle_signature(inp).strip().replace(u"\u00a0", " ")
diff --git a/tests/test_build_gettext.py b/tests/test_build_gettext.py
new file mode 100644
index 00000000..ab68289e
--- /dev/null
+++ b/tests/test_build_gettext.py
@@ -0,0 +1,81 @@
+# -*- coding: utf-8 -*-
+"""
+ test_build_gettext
+ ~~~~~~~~~~~~~~~~~~
+
+ Test the build process with gettext builder with the test root.
+
+ :copyright: Copyright 2010 by the Sphinx team, see AUTHORS.
+ :license: BSD, see LICENSE for details.
+"""
+
+import gettext
+import os
+from subprocess import Popen, PIPE
+
+from util import *
+from util import SkipTest
+
+
+def teardown_module():
+ (test_root / '_build').rmtree(True)
+
+
+@with_app(buildername='gettext')
+def test_all(app):
+ # Generic build; should fail only when the builder is horribly broken.
+ app.builder.build_all()
+
+
+@with_app(buildername='gettext')
+def test_build(app):
+ # Do messages end up in the correct location?
+ app.builder.build(['extapi', 'subdir/includes'])
+ # top-level documents end up in a message catalog
+ assert (app.outdir / 'extapi.pot').isfile()
+ # directory items are grouped into sections
+ assert (app.outdir / 'subdir.pot').isfile()
+
+
+@with_app(buildername='gettext')
+def test_gettext(app):
+ app.builder.build(['markup'])
+
+ (app.outdir / 'en' / 'LC_MESSAGES').makedirs()
+ cwd = os.getcwd()
+ os.chdir(app.outdir)
+ try:
+ try:
+ p = Popen(['msginit', '--no-translator', '-i', 'markup.pot',
+ '--locale', 'en_US'],
+ stdout=PIPE, stderr=PIPE)
+ except OSError:
+ raise SkipTest # most likely msginit was not found
+ else:
+ stdout, stderr = p.communicate()
+ if p.returncode != 0:
+ print stdout
+ print stderr
+ assert False, 'msginit exited with return code %s' % \
+ p.returncode
+ assert (app.outdir / 'en_US.po').isfile(), 'msginit failed'
+ try:
+ p = Popen(['msgfmt', 'en_US.po', '-o',
+ os.path.join('en', 'LC_MESSAGES', 'test_root.mo')],
+ stdout=PIPE, stderr=PIPE)
+ except OSError:
+ raise SkipTest # most likely msgfmt was not found
+ else:
+ stdout, stderr = p.communicate()
+ if p.returncode != 0:
+ print stdout
+ print stderr
+ assert False, 'msgfmt exited with return code %s' % \
+ p.returncode
+ assert (app.outdir / 'en' / 'LC_MESSAGES' / 'test_root.mo').isfile(), \
+ 'msgfmt failed'
+ finally:
+ os.chdir(cwd)
+
+ _ = gettext.translation('test_root', app.outdir, languages=['en']).gettext
+ assert _("Testing various markup") == u"Testing various markup"
diff --git a/tests/test_build_html.py b/tests/test_build_html.py
index 77808f88..4e25167f 100644
--- a/tests/test_build_html.py
+++ b/tests/test_build_html.py
@@ -11,6 +11,7 @@
import os
import re
+import sys
import htmlentitydefs
from StringIO import StringIO
@@ -40,8 +41,7 @@ http://www.python.org/logo.png
%(root)s/includes.txt:\\d*: WARNING: Encoding 'utf-8-sig' used for \
reading included file u'.*?wrongenc.inc' seems to be wrong, try giving an \
:encoding: option\\n?
-(%(root)s/includes.txt|None):4: WARNING: download file not readable: \
-nonexisting.png
+%(root)s/includes.txt:4: WARNING: download file not readable: .*?nonexisting.png
%(root)s/objects.txt:\\d*: WARNING: using old C markup; please migrate to \
new-style markup \(e.g. c:function instead of cfunction\), see \
http://sphinx.pocoo.org/domains.html
@@ -49,11 +49,16 @@ http://sphinx.pocoo.org/domains.html
HTML_WARNINGS = ENV_WARNINGS + """\
%(root)s/images.txt:20: WARNING: no matching candidate for image URI u'foo.\\*'
-%(root)s/markup.txt:: WARNING: invalid index entry u''
+%(root)s/markup.txt:: WARNING: invalid single index entry u''
%(root)s/markup.txt:: WARNING: invalid pair index entry u''
%(root)s/markup.txt:: WARNING: invalid pair index entry u'keyword; '
"""
+if sys.version_info >= (3, 0):
+ ENV_WARNINGS = remove_unicode_literals(ENV_WARNINGS)
+ HTML_WARNINGS = remove_unicode_literals(HTML_WARNINGS)
+
+
def tail_check(check):
rex = re.compile(check)
def checker(nodes):
@@ -69,8 +74,7 @@ HTML_XPATH = {
(".//img[@src='_images/img.png']", ''),
(".//img[@src='_images/img1.png']", ''),
(".//img[@src='_images/simg.png']", ''),
- (".//object[@data='_images/svgimg.svg']", ''),
- (".//embed[@src='_images/svgimg.svg']", ''),
+ (".//img[@src='_images/svgimg.svg']", ''),
],
'subdir/images.html': [
(".//img[@src='../_images/img1.png']", ''),
@@ -227,6 +231,14 @@ HTML_XPATH = {
'_static/statictmpl.html': [
(".//project", 'Sphinx <Tests>'),
],
+ 'genindex.html': [
+ # index entries
+ (".//a/strong", "Main"),
+ (".//a/strong", "[1]"),
+ (".//a/strong", "Other"),
+ (".//a", "entry"),
+ (".//dt/a", "double"),
+ ]
}
if pygments:
@@ -239,7 +251,7 @@ if pygments:
(".//div[@class='inc-lines highlight-text']//pre",
r'^class Foo:\n pass\nclass Bar:\n$'),
(".//div[@class='inc-startend highlight-text']//pre",
- ur'^foo = u"Including Unicode characters: üöä"\n$'),
+ ur'^foo = "Including Unicode characters: üöä"\n$'),
(".//div[@class='inc-preappend highlight-text']//pre",
r'(?m)^START CODE$'),
(".//div[@class='inc-pyobj-dedent highlight-python']//span",
diff --git a/tests/test_build_latex.py b/tests/test_build_latex.py
index b488440c..4e1e9f70 100644
--- a/tests/test_build_latex.py
+++ b/tests/test_build_latex.py
@@ -30,8 +30,12 @@ latex_warnfile = StringIO()
LATEX_WARNINGS = ENV_WARNINGS + """\
None:None: WARNING: no matching candidate for image URI u'foo.\\*'
WARNING: invalid pair index entry u''
+WARNING: invalid pair index entry u'keyword; '
"""
+if sys.version_info >= (3, 0):
+ LATEX_WARNINGS = remove_unicode_literals(LATEX_WARNINGS)
+
@with_app(buildername='latex', warning=latex_warnfile, cleanenv=True)
def test_latex(app):
diff --git a/tests/test_build_texinfo.py b/tests/test_build_texinfo.py
new file mode 100644
index 00000000..c626c976
--- /dev/null
+++ b/tests/test_build_texinfo.py
@@ -0,0 +1,67 @@
+# -*- coding: utf-8 -*-
+"""
+ test_build_texinfo
+ ~~~~~~~~~~~~~~~~~~
+
+ Test the build process with Texinfo builder with the test root.
+
+ :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
+ :license: BSD, see LICENSE for details.
+"""
+
+import os
+import re
+import sys
+from StringIO import StringIO
+from subprocess import Popen, PIPE
+
+from sphinx.writers.texinfo import TexinfoTranslator
+
+from util import *
+from test_build_html import ENV_WARNINGS
+
+
+def teardown_module():
+ (test_root / '_build').rmtree(True)
+
+
+texinfo_warnfile = StringIO()
+
+TEXINFO_WARNINGS = ENV_WARNINGS + """\
+None:None: WARNING: no matching candidate for image URI u'foo.\\*'
+None:None: WARNING: no matching candidate for image URI u'svgimg.\\*'
+"""
+
+if sys.version_info >= (3, 0):
+ TEXINFO_WARNINGS = remove_unicode_literals(TEXINFO_WARNINGS)
+
+
+@with_app(buildername='texinfo', warning=texinfo_warnfile, cleanenv=True)
+def test_texinfo(app):
+ TexinfoTranslator.ignore_missing_images = True
+ app.builder.build_all()
+ texinfo_warnings = texinfo_warnfile.getvalue().replace(os.sep, '/')
+ texinfo_warnings_exp = TEXINFO_WARNINGS % {'root': re.escape(app.srcdir)}
+ assert re.match(texinfo_warnings_exp + '$', texinfo_warnings), \
+ 'Warnings don\'t match:\n' + \
+ '--- Expected (regex):\n' + texinfo_warnings_exp + \
+ '--- Got:\n' + texinfo_warnings
+ # now, try to run makeinfo over it
+ cwd = os.getcwd()
+ os.chdir(app.outdir)
+ try:
+ try:
+ p = Popen(['makeinfo', '--no-split', 'SphinxTests.texi'],
+ stdout=PIPE, stderr=PIPE)
+ except OSError:
+ pass # most likely makeinfo was not found
+ else:
+ stdout, stderr = p.communicate()
+ retcode = p.returncode
+ if retcode != 0:
+ print stdout
+ print stderr
+ del app.cleanup_trees[:]
+ assert False, 'makeinfo exited with return code %s' % retcode
+ finally:
+ os.chdir(cwd)
diff --git a/tests/test_config.py b/tests/test_config.py
index e5638bdb..b07a71bf 100644
--- a/tests/test_config.py
+++ b/tests/test_config.py
@@ -9,6 +9,7 @@
:copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
:license: BSD, see LICENSE for details.
"""
+import sys
from util import *
@@ -38,7 +39,7 @@ def test_core_config(app):
# complex default values
assert 'html_title' not in cfg.__dict__
- assert cfg.html_title == 'Sphinx <Tests> v0.6alpha1 documentation'
+ assert cfg.html_title == 'Sphinx <Tests> 0.6alpha1 documentation'
# complex default values mustn't raise
for valuename in cfg.config_values:
@@ -84,11 +85,23 @@ def test_extension_values(app):
@with_tempdir
def test_errors_warnings(dir):
# test the error for syntax errors in the config file
- write_file(dir / 'conf.py', 'project = \n')
+ write_file(dir / 'conf.py', u'project = \n', 'ascii')
raises_msg(ConfigError, 'conf.py', Config, dir, 'conf.py', {}, None)
+ # test the automatic conversion of 2.x only code in configs
+ write_file(dir / 'conf.py', u'# -*- coding: utf-8\n\n'
+ u'project = u"Jägermeister"\n', 'utf-8')
+ cfg = Config(dir, 'conf.py', {}, None)
+ cfg.init_values()
+ assert cfg.project == u'Jägermeister'
+
# test the warning for bytestrings with non-ascii content
- write_file(dir / 'conf.py', '# -*- coding: latin-1\nproject = "foo\xe4"\n')
+ # bytestrings with non-ascii content are a syntax error in python3 so we
+ # skip the test there
+ if sys.version_info >= (3, 0):
+ return
+ write_file(dir / 'conf.py', u'# -*- coding: latin-1\nproject = "fooä"\n',
+ 'latin-1')
cfg = Config(dir, 'conf.py', {}, None)
warned = [False]
def warn(msg):
diff --git a/tests/test_coverage.py b/tests/test_coverage.py
index 6bbcc5dc..c554c52c 100644
--- a/tests/test_coverage.py
+++ b/tests/test_coverage.py
@@ -27,13 +27,15 @@ def test_build(app):
assert ' * function\n' not in py_undoc # these two are documented
assert ' * Class\n' not in py_undoc # in autodoc.txt
+ assert ' * mod -- No module named mod' # in the "failed import" section
+
c_undoc = (app.outdir / 'c.txt').text()
assert c_undoc.startswith('Undocumented C API elements\n'
'===========================\n')
assert 'api.h' in c_undoc
assert ' * Py_SphinxTest' in c_undoc
- undoc_py, undoc_c = pickle.loads((app.outdir / 'undoc.pickle').text())
+ undoc_py, undoc_c = pickle.loads((app.outdir / 'undoc.pickle').bytes())
assert len(undoc_c) == 1
# the key is the full path to the header file, which isn't testable
assert undoc_c.values()[0] == [('function', 'Py_SphinxTest')]
diff --git a/tests/test_cpp_domain.py b/tests/test_cpp_domain.py
index 30cdb69e..22e24a08 100644
--- a/tests/test_cpp_domain.py
+++ b/tests/test_cpp_domain.py
@@ -25,11 +25,8 @@ def test_type_definitions():
rv = parse('member_object', ' const std::string & name leftover')
assert unicode(rv) == 'const std::string& name'
- x = 'void operator()(const boost::array<VertexID, 2>& v) const'
- assert unicode(parse('function', x)) == x
-
- x = 'void operator()(const boost::array<VertexID, 2, "foo, bar">& v) const'
- assert unicode(parse('function', x)) == x
+ rv = parse('member_object', ' const std::string & name [n] leftover')
+ assert unicode(rv) == 'const std::string& name[n]'
rv = parse('member_object', 'const std::vector< unsigned int, long> &name')
assert unicode(rv) == 'const std::vector<unsigned int, long>& name'
@@ -51,6 +48,12 @@ def test_type_definitions():
assert unicode(parse('type_object', 'long long int foo')) == 'long long foo'
+ x = 'void operator()(const boost::array<VertexID, 2>& v) const'
+ assert unicode(parse('function', x)) == x
+
+ x = 'void operator()(const boost::array<VertexID, 2, "foo, bar">& v) const'
+ assert unicode(parse('function', x)) == x
+
x = 'MyClass::MyClass(MyClass::MyClass&&)'
assert unicode(parse('function', x)) == x
@@ -60,6 +63,16 @@ def test_type_definitions():
x = 'int get_value() const noexcept'
assert unicode(parse('function', x)) == x
+ x = 'int main(int argc, char* argv[][])'
+ assert unicode(parse('function', x)) == x
+
+ x = 'std::vector<std::pair<std::string, int>>& module::test(register ' \
+ 'foo, bar[n], std::string baz="foobar, blah, bleh") const = 0'
+ assert unicode(parse('function', x)) == x
+
+ x = 'module::myclass foo[n]'
+ assert unicode(parse('member_object', x)) == x
+
def test_operators():
x = parse('function', 'void operator new [ ] ()')
diff --git a/tests/test_doctest.py b/tests/test_doctest.py
index 8b1df592..577fcb00 100644
--- a/tests/test_doctest.py
+++ b/tests/test_doctest.py
@@ -15,10 +15,20 @@ import StringIO
from util import *
status = StringIO.StringIO()
+cleanup_called = 0
@with_app(buildername='doctest', status=status)
def test_build(app):
+ global cleanup_called
+ cleanup_called = 0
app.builder.build_all()
if app.statuscode != 0:
print >>sys.stderr, status.getvalue()
assert False, 'failures in doctests'
+ # in doctest.txt, there are two named groups and the default group,
+ # so the cleanup function must be called three times
+ assert cleanup_called == 3, 'testcleanup did not get executed enough times'
+
+def cleanup_call():
+ global cleanup_called
+ cleanup_called += 1
diff --git a/tests/test_env.py b/tests/test_env.py
index 33822b88..e62db33b 100644
--- a/tests/test_env.py
+++ b/tests/test_env.py
@@ -8,6 +8,7 @@
:copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
:license: BSD, see LICENSE for details.
"""
+import sys
from util import *
@@ -54,8 +55,10 @@ def test_images():
app._warning.reset()
htmlbuilder = StandaloneHTMLBuilder(app)
htmlbuilder.post_process_images(tree)
- assert "no matching candidate for image URI u'foo.*'" in \
- app._warning.content[-1]
+ image_uri_message = "no matching candidate for image URI u'foo.*'"
+ if sys.version_info >= (3, 0):
+ image_uri_message = remove_unicode_literals(image_uri_message)
+ assert image_uri_message in app._warning.content[-1]
assert set(htmlbuilder.images.keys()) == \
set(['subdir/img.png', 'img.png', 'subdir/simg.png', 'svgimg.svg'])
assert set(htmlbuilder.images.values()) == \
@@ -64,8 +67,7 @@ def test_images():
app._warning.reset()
latexbuilder = LaTeXBuilder(app)
latexbuilder.post_process_images(tree)
- assert "no matching candidate for image URI u'foo.*'" in \
- app._warning.content[-1]
+ assert image_uri_message in app._warning.content[-1]
assert set(latexbuilder.images.keys()) == \
set(['subdir/img.png', 'subdir/simg.png', 'img.png', 'img.pdf',
'svgimg.pdf'])
diff --git a/tests/test_intersphinx.py b/tests/test_intersphinx.py
index 91e15b89..563750f6 100644
--- a/tests/test_intersphinx.py
+++ b/tests/test_intersphinx.py
@@ -11,7 +11,10 @@
import zlib
import posixpath
-from cStringIO import StringIO
+try:
+ from io import BytesIO
+except ImportError:
+ from cStringIO import StringIO as BytesIO
from docutils import nodes
@@ -28,23 +31,23 @@ inventory_v1 = '''\
# Version: 1.0
module mod foo.html
module.cls class foo.html
-'''
+'''.encode('utf-8')
inventory_v2 = '''\
# Sphinx inventory version 2
# Project: foo
# Version: 2.0
# The remainder of this file is compressed with zlib.
-''' + zlib.compress('''\
+'''.encode('utf-8') + zlib.compress('''\
module1 py:module 0 foo.html#module-module1 Long Module desc
module2 py:module 0 foo.html#module-$ -
module1.func py:function 1 sub/foo.html#$ -
CFunc c:function 2 cfunc.html#CFunc -
-''')
+'''.encode('utf-8'))
def test_read_inventory_v1():
- f = StringIO(inventory_v1)
+ f = BytesIO(inventory_v1)
f.readline()
invdata = read_inventory_v1(f, '/util', posixpath.join)
assert invdata['py:module']['module'] == \
@@ -54,12 +57,12 @@ def test_read_inventory_v1():
def test_read_inventory_v2():
- f = StringIO(inventory_v2)
+ f = BytesIO(inventory_v2)
f.readline()
invdata1 = read_inventory_v2(f, '/util', posixpath.join)
# try again with a small buffer size to test the chunking algorithm
- f = StringIO(inventory_v2)
+ f = BytesIO(inventory_v2)
f.readline()
invdata2 = read_inventory_v2(f, '/util', posixpath.join, bufsize=5)
@@ -149,3 +152,27 @@ def test_missing_reference(tempdir, app):
rn = missing_reference(app, app.env, node, contnode)
assert rn is None
assert contnode[0].astext() == 'py3k:unknown'
+
+
+@with_app(confoverrides={'extensions': 'sphinx.ext.intersphinx'})
+@with_tempdir
+def test_load_mappings_warnings(tempdir, app):
+ """
+ load_mappings issues a warning if new-style mapping
+ identifiers are not alphanumeric
+ """
+ inv_file = tempdir / 'inventory'
+ write_file(inv_file, inventory_v2)
+ app.config.intersphinx_mapping = {
+ 'http://docs.python.org/': inv_file,
+ 'py3k': ('http://docs.python.org/py3k/', inv_file),
+ 'repoze.workflow': ('http://docs.repoze.org/workflow/', inv_file),
+ 'django-taggit': ('http://django-taggit.readthedocs.org/en/latest/', inv_file)
+ }
+
+ app.config.intersphinx_cache_limit = 0
+ # load the inventory and check if it's done correctly
+ load_mappings(app)
+ assert len(app._warning.content) == 2
+
+
diff --git a/tests/test_intl.py b/tests/test_intl.py
new file mode 100644
index 00000000..d1e28002
--- /dev/null
+++ b/tests/test_intl.py
@@ -0,0 +1,65 @@
+# -*- coding: utf-8 -*-
+"""
+ test_intl
+ ~~~~~~~~~
+
+ Test message patching for internationalization purposes. Runs the text
+ builder in the test root.
+
+ :copyright: Copyright 2010 by the Sphinx team, see AUTHORS.
+ :license: BSD, see LICENSE for details.
+"""
+
+from subprocess import Popen, PIPE
+
+from util import *
+from util import SkipTest
+
+
+def setup_module():
+ (test_root / 'xx' / 'LC_MESSAGES').makedirs()
+ # Compile all required catalogs into binary format (*.mo).
+ for catalog in 'bom', 'subdir':
+ try:
+ p = Popen(['msgfmt', test_root / '%s.po' % catalog, '-o',
+ test_root / 'xx' / 'LC_MESSAGES' / '%s.mo' % catalog],
+ stdout=PIPE, stderr=PIPE)
+ except OSError:
+ # The test will fail the second time it's run if we don't
+ # tear down here. Not sure if there's a more idiomatic way
+ # of ensuring that teardown gets run in the event of an
+ # exception from the setup function.
+ teardown_module()
+ raise SkipTest # most likely msgfmt was not found
+ else:
+ stdout, stderr = p.communicate()
+ if p.returncode != 0:
+ print stdout
+ print stderr
+ assert False, 'msgfmt exited with return code %s' % p.returncode
+ assert (test_root / 'xx' / 'LC_MESSAGES' / ('%s.mo' % catalog)
+ ).isfile(), 'msgfmt failed'
+
+
+def teardown_module():
+ (test_root / '_build').rmtree(True)
+ (test_root / 'xx').rmtree(True)
+
+
+@with_app(buildername='text',
+ confoverrides={'language': 'xx', 'locale_dirs': ['.']})
+def test_simple(app):
+ app.builder.build(['bom'])
+ result = (app.outdir / 'bom.txt').text(encoding='utf-8')
+ expect = (u"\nDatei mit UTF-8"
+ u"\n***************\n" # underline matches new translation
+ u"\nThis file has umlauts: äöü.\n")
+ assert result == expect
+
+
+@with_app(buildername='text',
+ confoverrides={'language': 'xx', 'locale_dirs': ['.']})
+def test_subdir(app):
+ app.builder.build(['subdir/includes'])
+ result = (app.outdir / 'subdir' / 'includes.txt').text(encoding='utf-8')
+ assert result.startswith(u"\ntranslation\n***********\n\n")
diff --git a/tests/test_markup.py b/tests/test_markup.py
index 51d4e724..4c8e7264 100644
--- a/tests/test_markup.py
+++ b/tests/test_markup.py
@@ -17,6 +17,7 @@ from docutils import frontend, utils, nodes
from docutils.parsers import rst
from sphinx.util import texescape
+from sphinx.util.pycompat import b
from sphinx.writers.html import HTMLWriter, SmartyPantsHTMLTranslator
from sphinx.writers.latex import LaTeXWriter, LaTeXTranslator
@@ -50,7 +51,7 @@ class ForgivingLaTeXTranslator(LaTeXTranslator, ForgivingTranslator):
def verify_re(rst, html_expected, latex_expected):
- document = utils.new_document('test data', settings)
+ document = utils.new_document(b('test data'), settings)
document['file'] = 'dummy'
parser.parse(rst, document)
for msg in document.traverse(nodes.system_message):
@@ -83,14 +84,14 @@ def test_inline():
_html = ('<p><tt class="(samp )?docutils literal"><span class="pre">'
'code</span>&nbsp;&nbsp; <span class="pre">sample</span></tt></p>')
yield verify_re, '``code sample``', _html, r'\\code{code sample}'
- yield verify_re, ':samp:`code sample`', _html, r'\\samp{code sample}'
+ yield verify_re, ':samp:`code sample`', _html, r'\\code{code sample}'
# interpolation of braces in samp and file roles (HTML only)
yield (verify, ':samp:`a{b}c`',
'<p><tt class="samp docutils literal"><span class="pre">a</span>'
'<em><span class="pre">b</span></em>'
'<span class="pre">c</span></tt></p>',
- '\\samp{abc}')
+ '\\code{a\\emph{b}c}')
# interpolation of arrows in menuselection
yield (verify, ':menuselection:`a --> b`',
@@ -126,9 +127,9 @@ def test_latex_escaping():
yield (verify, u'Γ\\\\∞$', None,
ur'\(\Gamma\)\textbackslash{}\(\infty\)\$')
# in verbatim code fragments
- yield (verify, u'::\n\n @Γ\\∞$[]', None,
- u'\\begin{Verbatim}[commandchars=@\\[\\]]\n'
- u'@PYGZat[]@(@Gamma@)\\@(@infty@)@$@PYGZlb[]@PYGZrb[]\n'
+ yield (verify, u'::\n\n @Γ\\∞${}', None,
+ u'\\begin{Verbatim}[commandchars=\\\\\\{\\}]\n'
+ u'@\\(\\Gamma\\)\\PYGZbs{}\\(\\infty\\)\\$\\PYGZob{}\\PYGZcb{}\n'
u'\\end{Verbatim}')
# in URIs
yield (verify_re, u'`test <http://example.com/~me/>`_', None,
diff --git a/tests/test_quickstart.py b/tests/test_quickstart.py
index 10290646..26064117 100644
--- a/tests/test_quickstart.py
+++ b/tests/test_quickstart.py
@@ -11,7 +11,6 @@
import sys
import time
-import __builtin__
from util import *
@@ -36,8 +35,13 @@ def mock_raw_input(answers, needanswer=False):
return ''
return raw_input
+try:
+ real_raw_input = raw_input
+except NameError:
+ real_raw_input = input
+
def teardown_module():
- qs.raw_input = __builtin__.raw_input
+ qs.term_input = real_raw_input
qs.TERM_ENCODING = getattr(sys.stdin, 'encoding', None)
coloron()
@@ -51,7 +55,7 @@ def test_do_prompt():
'Q5': 'no',
'Q6': 'foo',
}
- qs.raw_input = mock_raw_input(answers)
+ qs.term_input = mock_raw_input(answers)
try:
qs.do_prompt(d, 'k1', 'Q1')
except AssertionError:
@@ -79,13 +83,20 @@ def test_quickstart_defaults(tempdir):
'Author name': 'Georg Brandl',
'Project version': '0.1',
}
- qs.raw_input = mock_raw_input(answers)
- qs.inner_main([])
+ qs.term_input = mock_raw_input(answers)
+ d = {}
+ qs.ask_user(d)
+ qs.generate(d)
conffile = tempdir / 'conf.py'
assert conffile.isfile()
ns = {}
- execfile(conffile, ns)
+ f = open(conffile, 'U')
+ try:
+ code = compile(f.read(), conffile, 'exec')
+ finally:
+ f.close()
+ exec code in ns
assert ns['extensions'] == []
assert ns['templates_path'] == ['_templates']
assert ns['source_suffix'] == '.rst'
@@ -112,8 +123,8 @@ def test_quickstart_all_answers(tempdir):
'Root path': tempdir,
'Separate source and build': 'y',
'Name prefix for templates': '.',
- 'Project name': 'STASI\xe2\x84\xa2',
- 'Author name': 'Wolfgang Sch\xc3\xa4uble & G\'Beckstein',
+ 'Project name': u'STASI™'.encode('utf-8'),
+ 'Author name': u'Wolfgang Schäuble & G\'Beckstein'.encode('utf-8'),
'Project version': '2.0',
'Project release': '2.0.1',
'Source file suffix': '.txt',
@@ -124,21 +135,28 @@ def test_quickstart_all_answers(tempdir):
'todo': 'n',
'coverage': 'no',
'pngmath': 'N',
- 'jsmath': 'no',
+ 'mathjax': 'no',
'ifconfig': 'no',
'viewcode': 'no',
'Create Makefile': 'no',
'Create Windows command file': 'no',
'Do you want to use the epub builder': 'yes',
}
- qs.raw_input = mock_raw_input(answers, needanswer=True)
+ qs.term_input = mock_raw_input(answers, needanswer=True)
qs.TERM_ENCODING = 'utf-8'
- qs.inner_main([])
+ d = {}
+ qs.ask_user(d)
+ qs.generate(d)
conffile = tempdir / 'source' / 'conf.py'
assert conffile.isfile()
ns = {}
- execfile(conffile, ns)
+ f = open(conffile, 'U')
+ try:
+ code = compile(f.read(), conffile, 'exec')
+ finally:
+ f.close()
+ exec code in ns
assert ns['extensions'] == ['sphinx.ext.autodoc', 'sphinx.ext.doctest']
assert ns['templates_path'] == ['.templates']
assert ns['source_suffix'] == '.txt'
@@ -156,6 +174,10 @@ def test_quickstart_all_answers(tempdir):
assert ns['man_pages'] == [
('contents', 'stasi', u'STASI™ Documentation',
[u'Wolfgang Schäuble & G\'Beckstein'], 1)]
+ assert ns['texinfo_documents'] == [
+ ('contents', 'STASI', u'STASI™ Documentation',
+ u'Wolfgang Schäuble & G\'Beckstein', 'STASI',
+ 'One line description of project.', 'Miscellaneous'),]
assert (tempdir / 'build').isdir()
assert (tempdir / 'source' / '.static').isdir()
diff --git a/tests/test_search.py b/tests/test_search.py
index b2cd165c..d9dcfb81 100644
--- a/tests/test_search.py
+++ b/tests/test_search.py
@@ -13,6 +13,7 @@ from docutils import frontend, utils
from docutils.parsers import rst
from sphinx.search import IndexBuilder
+from sphinx.util.pycompat import b
settings = parser = None
@@ -31,11 +32,11 @@ test that non-comments are indexed: fermion
'''
def test_wordcollector():
- doc = utils.new_document('test data', settings)
+ doc = utils.new_document(b('test data'), settings)
doc['file'] = 'dummy'
parser.parse(FILE_CONTENTS, doc)
- ix = IndexBuilder(None)
+ ix = IndexBuilder(None, 'en', {})
ix.feed('filename', 'title', doc)
assert 'boson' not in ix._mapping
assert 'fermion' in ix._mapping
diff --git a/tests/test_searchadapters.py b/tests/test_searchadapters.py
new file mode 100644
index 00000000..c20a74e3
--- /dev/null
+++ b/tests/test_searchadapters.py
@@ -0,0 +1,79 @@
+# -*- coding: utf-8 -*-
+"""
+ test_searchadapters
+ ~~~~~~~~~~~~~~~~~~~
+
+ Test the Web Support Package search adapters.
+
+ :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
+ :license: BSD, see LICENSE for details.
+"""
+
+import os, sys
+from StringIO import StringIO
+
+from nose import SkipTest
+
+from sphinx.websupport import WebSupport
+
+from test_websupport import sqlalchemy_missing
+from util import *
+
+
+def clear_builddir():
+ (test_root / 'websupport').rmtree(True)
+
+
+def teardown_module():
+ (test_root / 'generated').rmtree(True)
+ clear_builddir()
+
+
+def search_adapter_helper(adapter):
+ clear_builddir()
+
+ settings = {'builddir': os.path.join(test_root, 'websupport'),
+ 'status': StringIO(),
+ 'warning': StringIO()}
+ settings.update({'srcdir': test_root,
+ 'search': adapter})
+ support = WebSupport(**settings)
+ support.build()
+
+ s = support.search
+
+ # Test the adapters query method. A search for "Epigraph" should return
+ # one result.
+ results = s.query(u'Epigraph')
+ assert len(results) == 1, \
+ '%s search adapter returned %s search result(s), should have been 1'\
+ % (adapter, len(results))
+
+ # Make sure documents are properly updated by the search adapter.
+ s.init_indexing(changed=['markup'])
+ s.add_document(u'markup', u'title', u'SomeLongRandomWord')
+ s.finish_indexing()
+ # Now a search for "Epigraph" should return zero results.
+ results = s.query(u'Epigraph')
+ assert len(results) == 0, \
+ '%s search adapter returned %s search result(s), should have been 0'\
+ % (adapter, len(results))
+ # A search for "SomeLongRandomWord" should return one result.
+ results = s.query(u'SomeLongRandomWord')
+ assert len(results) == 1, \
+ '%s search adapter returned %s search result(s), should have been 1'\
+ % (adapter, len(results))
+ # Make sure it works through the WebSupport API
+ html = support.get_search_results(u'SomeLongRandomWord')
+
+
+@skip_unless_importable('xapian', 'needs xapian bindings installed')
+@skip_if(sqlalchemy_missing, 'needs sqlalchemy')
+def test_xapian():
+ search_adapter_helper('xapian')
+
+
+@skip_unless_importable('whoosh', 'needs whoosh package installed')
+@skip_if(sqlalchemy_missing, 'needs sqlalchemy')
+def test_whoosh():
+ search_adapter_helper('whoosh')
diff --git a/tests/test_theming.py b/tests/test_theming.py
index 79f94ef6..c924223c 100644
--- a/tests/test_theming.py
+++ b/tests/test_theming.py
@@ -25,7 +25,8 @@ def test_theme_api(app):
# test Theme class API
assert set(Theme.themes.keys()) == \
set(['basic', 'default', 'scrolls', 'agogo', 'sphinxdoc', 'haiku',
- 'traditional', 'testtheme', 'ziptheme', 'epub', 'nature'])
+ 'traditional', 'testtheme', 'ziptheme', 'epub', 'nature',
+ 'pyramid'])
assert Theme.themes['testtheme'][1] is None
assert isinstance(Theme.themes['ziptheme'][1], zipfile.ZipFile)
diff --git a/tests/test_versioning.py b/tests/test_versioning.py
new file mode 100644
index 00000000..018c7093
--- /dev/null
+++ b/tests/test_versioning.py
@@ -0,0 +1,115 @@
+# -*- coding: utf-8 -*-
+"""
+ test_versioning
+ ~~~~~~~~~~~~~~~
+
+ Test the versioning implementation.
+
+ :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
+ :license: BSD, see LICENSE for details.
+"""
+import pickle
+
+from util import *
+
+from docutils.statemachine import ViewList
+from docutils.parsers.rst.directives.html import MetaBody
+
+from sphinx import addnodes
+from sphinx.versioning import add_uids, merge_doctrees, get_ratio
+from sphinx.util.pycompat import all
+
+def setup_module():
+ global app, original, original_uids
+ app = TestApp()
+ app.builder.env.app = app
+ app.connect('doctree-resolved', on_doctree_resolved)
+ app.build()
+ original = doctrees['versioning/original']
+ original_uids = [n.uid for n in add_uids(original, is_paragraph)]
+
+def teardown_module():
+ app.cleanup()
+ (test_root / '_build').rmtree(True)
+
+doctrees = {}
+
+def on_doctree_resolved(app, doctree, docname):
+ doctrees[docname] = doctree
+
+def is_paragraph(node):
+ return node.__class__.__name__ == 'paragraph'
+
+def test_get_ratio():
+ assert get_ratio('', 'a')
+ assert get_ratio('a', '')
+
+def test_add_uids():
+ assert len(original_uids) == 3
+
+def test_picklablility():
+ # we have to modify the doctree so we can pickle it
+ copy = original.copy()
+ copy.reporter = None
+ copy.transformer = None
+ copy.settings.warning_stream = None
+ copy.settings.env = None
+ copy.settings.record_dependencies = None
+ for metanode in copy.traverse(MetaBody.meta):
+ metanode.__class__ = addnodes.meta
+ loaded = pickle.loads(pickle.dumps(copy, pickle.HIGHEST_PROTOCOL))
+ assert all(getattr(n, 'uid', False) for n in loaded.traverse(is_paragraph))
+
+def test_modified():
+ modified = doctrees['versioning/modified']
+ new_nodes = list(merge_doctrees(original, modified, is_paragraph))
+ uids = [n.uid for n in modified.traverse(is_paragraph)]
+ assert not new_nodes
+ assert original_uids == uids
+
+def test_added():
+ added = doctrees['versioning/added']
+ new_nodes = list(merge_doctrees(original, added, is_paragraph))
+ uids = [n.uid for n in added.traverse(is_paragraph)]
+ assert len(new_nodes) == 1
+ assert original_uids == uids[:-1]
+
+def test_deleted():
+ deleted = doctrees['versioning/deleted']
+ new_nodes = list(merge_doctrees(original, deleted, is_paragraph))
+ uids = [n.uid for n in deleted.traverse(is_paragraph)]
+ assert not new_nodes
+ assert original_uids[::2] == uids
+
+def test_deleted_end():
+ deleted_end = doctrees['versioning/deleted_end']
+ new_nodes = list(merge_doctrees(original, deleted_end, is_paragraph))
+ uids = [n.uid for n in deleted_end.traverse(is_paragraph)]
+ assert not new_nodes
+ assert original_uids[:-1] == uids
+
+def test_insert():
+ insert = doctrees['versioning/insert']
+ new_nodes = list(merge_doctrees(original, insert, is_paragraph))
+ uids = [n.uid for n in insert.traverse(is_paragraph)]
+ assert len(new_nodes) == 1
+ assert original_uids[0] == uids[0]
+ assert original_uids[1:] == uids[2:]
+
+def test_insert_beginning():
+ insert_beginning = doctrees['versioning/insert_beginning']
+ new_nodes = list(merge_doctrees(original, insert_beginning, is_paragraph))
+ uids = [n.uid for n in insert_beginning.traverse(is_paragraph)]
+ assert len(new_nodes) == 1
+ assert len(uids) == 4
+ assert original_uids == uids[1:]
+ assert original_uids[0] != uids[0]
+
+def test_insert_similar():
+ insert_similar = doctrees['versioning/insert_similar']
+ new_nodes = list(merge_doctrees(original, insert_similar, is_paragraph))
+ uids = [n.uid for n in insert_similar.traverse(is_paragraph)]
+ assert len(new_nodes) == 1
+ assert new_nodes[0].rawsource == u'Anyway I need more'
+ assert original_uids[0] == uids[0]
+ assert original_uids[1:] == uids[2:]
diff --git a/tests/test_websupport.py b/tests/test_websupport.py
new file mode 100644
index 00000000..d7b5fb32
--- /dev/null
+++ b/tests/test_websupport.py
@@ -0,0 +1,275 @@
+# -*- coding: utf-8 -*-
+"""
+ test_websupport
+ ~~~~~~~~~~~~~~~
+
+ Test the Web Support Package
+
+ :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
+ :license: BSD, see LICENSE for details.
+"""
+
+import os
+from StringIO import StringIO
+
+try:
+ from functools import wraps
+except ImportError:
+ # functools is new in 2.5
+ wraps = lambda f: (lambda w: w)
+
+from sphinx.websupport import WebSupport
+from sphinx.websupport.errors import *
+from sphinx.websupport.storage import StorageBackend
+from sphinx.websupport.storage.differ import CombinedHtmlDiff
+try:
+ from sphinx.websupport.storage.sqlalchemystorage import Session, \
+ Comment, CommentVote
+ from sphinx.websupport.storage.sqlalchemy_db import Node
+ sqlalchemy_missing = False
+except ImportError:
+ sqlalchemy_missing = True
+
+from util import *
+
+
+default_settings = {'builddir': os.path.join(test_root, 'websupport'),
+ 'status': StringIO(),
+ 'warning': StringIO()}
+
+def teardown_module():
+ (test_root / 'generated').rmtree(True)
+ (test_root / 'websupport').rmtree(True)
+
+
+def with_support(*args, **kwargs):
+ """Make a WebSupport object and pass it the test."""
+ settings = default_settings.copy()
+ settings.update(kwargs)
+
+ def generator(func):
+ @wraps(func)
+ def new_func(*args2, **kwargs2):
+ support = WebSupport(**settings)
+ func(support, *args2, **kwargs2)
+ return new_func
+ return generator
+
+
+class NullStorage(StorageBackend):
+ pass
+
+
+@with_support(storage=NullStorage())
+def test_no_srcdir(support):
+ """Make sure the correct exception is raised if srcdir is not given."""
+ raises(RuntimeError, support.build)
+
+
+@skip_if(sqlalchemy_missing, 'needs sqlalchemy')
+@with_support(srcdir=test_root)
+def test_build(support):
+ support.build()
+
+
+@skip_if(sqlalchemy_missing, 'needs sqlalchemy')
+@with_support()
+def test_get_document(support):
+ raises(DocumentNotFoundError, support.get_document, 'nonexisting')
+
+ contents = support.get_document('contents')
+ assert contents['title'] and contents['body'] \
+ and contents['sidebar'] and contents['relbar']
+
+
+@skip_if(sqlalchemy_missing, 'needs sqlalchemy')
+@with_support()
+def test_comments(support):
+ session = Session()
+ nodes = session.query(Node).all()
+ first_node = nodes[0]
+ second_node = nodes[1]
+
+ # Create a displayed comment and a non displayed comment.
+ comment = support.add_comment('First test comment',
+ node_id=first_node.id,
+ username='user_one')
+ hidden_comment = support.add_comment('Hidden comment',
+ node_id=first_node.id,
+ displayed=False)
+ # Make sure that comments can't be added to a comment where
+ # displayed == False, since it could break the algorithm that
+ # converts a nodes comments to a tree.
+ raises(CommentNotAllowedError, support.add_comment, 'Not allowed',
+ parent_id=str(hidden_comment['id']))
+ # Add a displayed and not displayed child to the displayed comment.
+ support.add_comment('Child test comment', parent_id=str(comment['id']),
+ username='user_one')
+ support.add_comment('Hidden child test comment',
+ parent_id=str(comment['id']), displayed=False)
+ # Add a comment to another node to make sure it isn't returned later.
+ support.add_comment('Second test comment',
+ node_id=second_node.id,
+ username='user_two')
+
+ # Access the comments as a moderator.
+ data = support.get_data(first_node.id, moderator=True)
+ comments = data['comments']
+ children = comments[0]['children']
+ assert len(comments) == 2
+ assert comments[1]['text'] == '<p>Hidden comment</p>\n'
+ assert len(children) == 2
+ assert children[1]['text'] == '<p>Hidden child test comment</p>\n'
+
+ # Access the comments without being a moderator.
+ data = support.get_data(first_node.id)
+ comments = data['comments']
+ children = comments[0]['children']
+ assert len(comments) == 1
+ assert comments[0]['text'] == '<p>First test comment</p>\n'
+ assert len(children) == 1
+ assert children[0]['text'] == '<p>Child test comment</p>\n'
+
+
+@skip_if(sqlalchemy_missing, 'needs sqlalchemy')
+@with_support()
+def test_voting(support):
+ session = Session()
+ nodes = session.query(Node).all()
+ node = nodes[0]
+
+ comment = support.get_data(node.id)['comments'][0]
+
+ def check_rating(val):
+ data = support.get_data(node.id)
+ comment = data['comments'][0]
+ assert comment['rating'] == val, '%s != %s' % (comment['rating'], val)
+
+ support.process_vote(comment['id'], 'user_one', '1')
+ support.process_vote(comment['id'], 'user_two', '1')
+ support.process_vote(comment['id'], 'user_three', '1')
+ check_rating(3)
+ support.process_vote(comment['id'], 'user_one', '-1')
+ check_rating(1)
+ support.process_vote(comment['id'], 'user_one', '0')
+ check_rating(2)
+
+ # Make sure a vote with value > 1 or < -1 can't be cast.
+ raises(ValueError, support.process_vote, comment['id'], 'user_one', '2')
+ raises(ValueError, support.process_vote, comment['id'], 'user_one', '-2')
+
+ # Make sure past voting data is associated with comments when they are
+ # fetched.
+ data = support.get_data(str(node.id), username='user_two')
+ comment = data['comments'][0]
+ assert comment['vote'] == 1, '%s != 1' % comment['vote']
+
+
+@skip_if(sqlalchemy_missing, 'needs sqlalchemy')
+@with_support()
+def test_proposals(support):
+ session = Session()
+ node = session.query(Node).first()
+
+ data = support.get_data(node.id)
+
+ source = data['source']
+ proposal = source[:5] + source[10:15] + 'asdf' + source[15:]
+
+ comment = support.add_comment('Proposal comment',
+ node_id=node.id,
+ proposal=proposal)
+
+
+@skip_if(sqlalchemy_missing, 'needs sqlalchemy')
+@with_support()
+def test_user_delete_comments(support):
+ def get_comment():
+ session = Session()
+ node = session.query(Node).first()
+ session.close()
+ return support.get_data(node.id)['comments'][0]
+
+ comment = get_comment()
+ assert comment['username'] == 'user_one'
+ # Make sure other normal users can't delete someone elses comments.
+ raises(UserNotAuthorizedError, support.delete_comment,
+ comment['id'], username='user_two')
+ # Now delete the comment using the correct username.
+ support.delete_comment(comment['id'], username='user_one')
+ comment = get_comment()
+ assert comment['username'] == '[deleted]'
+ assert comment['text'] == '[deleted]'
+
+
+@skip_if(sqlalchemy_missing, 'needs sqlalchemy')
+@with_support()
+def test_moderator_delete_comments(support):
+ def get_comment():
+ session = Session()
+ node = session.query(Node).first()
+ session.close()
+ return support.get_data(node.id, moderator=True)['comments'][1]
+
+ comment = get_comment()
+ support.delete_comment(comment['id'], username='user_two',
+ moderator=True)
+ raises(IndexError, get_comment)
+
+
+@skip_if(sqlalchemy_missing, 'needs sqlalchemy')
+@with_support()
+def test_update_username(support):
+ support.update_username('user_two', 'new_user_two')
+ session = Session()
+ comments = session.query(Comment).\
+ filter(Comment.username == 'user_two').all()
+ assert len(comments) == 0
+ votes = session.query(CommentVote).\
+ filter(CommentVote.username == 'user_two').all()
+ assert len(votes) == 0
+ comments = session.query(Comment).\
+ filter(Comment.username == 'new_user_two').all()
+ assert len(comments) == 1
+ votes = session.query(CommentVote).\
+ filter(CommentVote.username == 'new_user_two').all()
+ assert len(votes) == 0
+
+
+called = False
+def moderation_callback(comment):
+ global called
+ called = True
+
+
+@skip_if(sqlalchemy_missing, 'needs sqlalchemy')
+@with_support(moderation_callback=moderation_callback)
+def test_moderation(support):
+ session = Session()
+ nodes = session.query(Node).all()
+ node = nodes[7]
+ session.close()
+ accepted = support.add_comment('Accepted Comment', node_id=node.id,
+ displayed=False)
+ deleted = support.add_comment('Comment to delete', node_id=node.id,
+ displayed=False)
+ # Make sure the moderation_callback is called.
+ assert called == True
+ # Make sure the user must be a moderator.
+ raises(UserNotAuthorizedError, support.accept_comment, accepted['id'])
+ raises(UserNotAuthorizedError, support.delete_comment, deleted['id'])
+ support.accept_comment(accepted['id'], moderator=True)
+ support.delete_comment(deleted['id'], moderator=True)
+ comments = support.get_data(node.id)['comments']
+ assert len(comments) == 1
+ comments = support.get_data(node.id, moderator=True)['comments']
+ assert len(comments) == 1
+
+
+def test_differ():
+ source = 'Lorem ipsum dolor sit amet,\nconsectetur adipisicing elit,\n' \
+ 'sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.'
+ prop = 'Lorem dolor sit amet,\nconsectetur nihil adipisicing elit,\n' \
+ 'sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.'
+ differ = CombinedHtmlDiff(source, prop)
+ differ.make_html()
diff --git a/tests/util.py b/tests/util.py
index b5c60712..bd50bec0 100644
--- a/tests/util.py
+++ b/tests/util.py
@@ -11,6 +11,8 @@ import sys
import StringIO
import tempfile
import shutil
+import re
+from codecs import open
try:
from functools import wraps
@@ -23,15 +25,15 @@ from sphinx.ext.autodoc import AutoDirective
from path import path
-from nose import tools
+from nose import tools, SkipTest
__all__ = [
- 'test_root',
- 'raises', 'raises_msg', 'Struct',
+ 'test_root', 'raises', 'raises_msg',
+ 'skip_if', 'skip_unless', 'skip_unless_importable', 'Struct',
'ListOutput', 'TestApp', 'with_app', 'gen_with_app',
'path', 'with_tempdir', 'write_file',
- 'sprint',
+ 'sprint', 'remove_unicode_literals',
]
@@ -69,6 +71,30 @@ def raises_msg(exc, msg, func, *args, **kwds):
raise AssertionError('%s did not raise %s' %
(func.__name__, _excstr(exc)))
+def skip_if(condition, msg=None):
+ """Decorator to skip test if condition is true."""
+ def deco(test):
+ @tools.make_decorator(test)
+ def skipper(*args, **kwds):
+ if condition:
+ raise SkipTest(msg or 'conditional skip')
+ return test(*args, **kwds)
+ return skipper
+ return deco
+
+def skip_unless(condition, msg=None):
+ """Decorator to skip test if condition is false."""
+ return skip_if(not condition, msg)
+
+def skip_unless_importable(module, msg=None):
+ """Decorator to skip test if module is not importable."""
+ try:
+ __import__(module)
+ except ImportError:
+ return skip_if(True, msg)
+ else:
+ return skip_if(False, msg)
+
class Struct(object):
def __init__(self, **kwds):
@@ -167,8 +193,8 @@ def with_app(*args, **kwargs):
def gen_with_app(*args, **kwargs):
"""
- Make a TestApp with args and kwargs, pass it to the test and clean up
- properly.
+ Decorate a test generator to pass a TestApp as the first argument to the
+ test generator when it's executed.
"""
def generator(func):
@wraps(func)
@@ -191,11 +217,21 @@ def with_tempdir(func):
return new_func
-def write_file(name, contents):
- f = open(str(name), 'wb')
+def write_file(name, contents, encoding=None):
+ if encoding is None:
+ mode = 'wb'
+ if isinstance(contents, unicode):
+ contents = contents.encode('ascii')
+ else:
+ mode = 'w'
+ f = open(str(name), mode, encoding=encoding)
f.write(contents)
f.close()
def sprint(*args):
sys.stderr.write(' '.join(map(str, args)) + '\n')
+
+_unicode_literals_re = re.compile(r'u(".*?")|u(\'.*?\')')
+def remove_unicode_literals(s):
+ return _unicode_literals_re.sub(lambda x: x.group(1) or x.group(2), s)
diff --git a/tox.ini b/tox.ini
index 19120483..15e36aae 100644
--- a/tox.ini
+++ b/tox.ini
@@ -1,8 +1,9 @@
[tox]
-envlist=py24,py25,py26,py27,pypy,du07,du06,du05
+envlist=py24,py25,py26,py27,py31,py32,pypy,du08,du07,du06,du05
[testenv]
-deps=nose
+deps=
+ nose
commands=
nosetests
sphinx-build -W -b html -d {envtmpdir}/doctrees doc {envtmpdir}/html
@@ -12,11 +13,6 @@ deps=
nose
simplejson
-[testenv:py25]
-deps=
- nose
- simplejson
-
[testenv:pypy]
deps=
nose
@@ -36,3 +32,8 @@ deps=
deps=
nose
docutils==0.7
+
+[testenv:du08]
+deps=
+ nose
+ docutils==0.8.1
diff --git a/utils/check_sources.py b/utils/check_sources.py
index 80e3f099..6b030d5d 100755
--- a/utils/check_sources.py
+++ b/utils/check_sources.py
@@ -12,10 +12,16 @@
"""
import sys, os, re
-import getopt
import cStringIO
+from optparse import OptionParser
from os.path import join, splitext, abspath
+if sys.version_info >= (3, 0):
+ def b(s):
+ return s.encode('utf-8')
+else:
+ b = str
+
checkers = {}
@@ -30,26 +36,26 @@ def checker(*suffixes, **kwds):
name_mail_re = r'[\w ]+(<.*?>)?'
-copyright_re = re.compile(r'^ :copyright: Copyright 200\d(-20\d\d)? '
- r'by %s(, %s)*[,.]$' %
- (name_mail_re, name_mail_re))
-license_re = re.compile(r" :license: (.*?).\n")
-copyright_2_re = re.compile(r'^ %s(, %s)*[,.]$' %
- (name_mail_re, name_mail_re))
-coding_re = re.compile(r'coding[:=]\s*([-\w.]+)')
-not_ix_re = re.compile(r'\bnot\s+\S+?\s+i[sn]\s\S+')
-is_const_re = re.compile(r'if.*?==\s+(None|False|True)\b')
-
-misspellings = ["developement", "adress", "verificate", # ALLOW-MISSPELLING
- "informations"] # ALLOW-MISSPELLING
-
-
-@checker('.py')
-def check_syntax(fn, lines):
- try:
- compile(''.join(lines), fn, "exec")
- except SyntaxError, err:
- yield 0, "not compilable: %s" % err
+copyright_re = re.compile(b(r'^ :copyright: Copyright 200\d(-20\d\d)? '
+ r'by %s(, %s)*[,.]$' %
+ (name_mail_re, name_mail_re)))
+license_re = re.compile(b(r" :license: (.*?).\n"))
+copyright_2_re = re.compile(b(r'^ %s(, %s)*[,.]$' %
+ (name_mail_re, name_mail_re)))
+coding_re = re.compile(b(r'coding[:=]\s*([-\w.]+)'))
+not_ix_re = re.compile(b(r'\bnot\s+\S+?\s+i[sn]\s\S+'))
+is_const_re = re.compile(b(r'if.*?==\s+(None|False|True)\b'))
+
+misspellings = [b("developement"), b("adress"), # ALLOW-MISSPELLING
+ b("verificate"), b("informations")] # ALLOW-MISSPELLING
+
+if sys.version_info < (3, 0):
+ @checker('.py')
+ def check_syntax(fn, lines):
+ try:
+ compile(b('').join(lines), fn, "exec")
+ except SyntaxError, err:
+ yield 0, "not compilable: %s" % err
@checker('.py')
@@ -61,8 +67,8 @@ def check_style_and_encoding(fn, lines):
if lno < 2:
co = coding_re.search(line)
if co:
- encoding = co.group(1)
- if line.strip().startswith('#'):
+ encoding = co.group(1).decode('ascii')
+ if line.strip().startswith(b('#')):
continue
#m = not_ix_re.search(line)
#if m:
@@ -82,7 +88,7 @@ def check_style_and_encoding(fn, lines):
def check_fileheader(fn, lines):
# line number correction
c = 1
- if lines[0:1] == ['#!/usr/bin/env python\n']:
+ if lines[0:1] == [b('#!/usr/bin/env python\n')]:
lines = lines[1:]
c = 2
@@ -91,38 +97,38 @@ def check_fileheader(fn, lines):
for lno, l in enumerate(lines):
llist.append(l)
if lno == 0:
- if l == '# -*- coding: rot13 -*-\n':
+ if l == b('# -*- coding: rot13 -*-\n'):
# special-case pony package
return
- elif l != '# -*- coding: utf-8 -*-\n':
+ elif l != b('# -*- coding: utf-8 -*-\n'):
yield 1, "missing coding declaration"
elif lno == 1:
- if l != '"""\n' and l != 'r"""\n':
+ if l != b('"""\n') and l != b('r"""\n'):
yield 2, 'missing docstring begin (""")'
else:
docopen = True
elif docopen:
- if l == '"""\n':
+ if l == b('"""\n'):
# end of docstring
if lno <= 4:
yield lno+c, "missing module name in docstring"
break
- if l != "\n" and l[:4] != ' ' and docopen:
+ if l != b("\n") and l[:4] != b(' ') and docopen:
yield lno+c, "missing correct docstring indentation"
if lno == 2:
# if not in package, don't check the module name
modname = fn[:-3].replace('/', '.').replace('.__init__', '')
while modname:
- if l.lower()[4:-1] == modname:
+ if l.lower()[4:-1] == b(modname):
break
modname = '.'.join(modname.split('.')[1:])
else:
yield 3, "wrong module name in docstring heading"
modnamelen = len(l.strip())
elif lno == 3:
- if l.strip() != modnamelen * "~":
+ if l.strip() != modnamelen * b("~"):
yield 4, "wrong module name underline, should be ~~~...~"
else:
@@ -145,16 +151,16 @@ def check_fileheader(fn, lines):
@checker('.py', '.html', '.rst')
def check_whitespace_and_spelling(fn, lines):
for lno, line in enumerate(lines):
- if "\t" in line:
+ if b("\t") in line:
yield lno+1, "OMG TABS!!!1 "
- if line[:-1].rstrip(' \t') != line[:-1]:
+ if line[:-1].rstrip(b(' \t')) != line[:-1]:
yield lno+1, "trailing whitespace"
for word in misspellings:
- if word in line and 'ALLOW-MISSPELLING' not in line:
+ if word in line and b('ALLOW-MISSPELLING') not in line:
yield lno+1, '"%s" used' % word
-bad_tags = ('<u>', '<s>', '<strike>', '<center>', '<font')
+bad_tags = map(b, ['<u>', '<s>', '<strike>', '<center>', '<font'])
@checker('.html')
def check_xhtml(fn, lines):
@@ -165,34 +171,32 @@ def check_xhtml(fn, lines):
def main(argv):
- try:
- gopts, args = getopt.getopt(argv[1:], "vi:")
- except getopt.GetoptError:
- print "Usage: %s [-v] [-i ignorepath]* [path]" % argv[0]
- return 2
- opts = {}
- for opt, val in gopts:
- if opt == '-i':
- val = abspath(val)
- opts.setdefault(opt, []).append(val)
+ parser = OptionParser(usage='Usage: %prog [-v] [-i ignorepath]* [path]')
+ parser.add_option('-v', '--verbose', dest='verbose', default=False,
+ action='store_true')
+ parser.add_option('-i', '--ignore-path', dest='ignored_paths',
+ default=[], action='append')
+ options, args = parser.parse_args(argv[1:])
if len(args) == 0:
path = '.'
elif len(args) == 1:
path = args[0]
else:
- print "Usage: %s [-v] [-i ignorepath]* [path]" % argv[0]
- return 2
+ print args
+ parser.error('No more then one path supported')
- verbose = '-v' in opts
+ verbose = options.verbose
+ ignored_paths = set(abspath(p) for p in options.ignored_paths)
num = 0
out = cStringIO.StringIO()
for root, dirs, files in os.walk(path):
- if '.svn' in dirs:
- dirs.remove('.svn')
- if '-i' in opts and abspath(root) in opts['-i']:
+ for vcs_dir in ['.svn', '.hg', '.git']:
+ if vcs_dir in dirs:
+ dirs.remove(vcs_dir)
+ if abspath(root) in ignored_paths:
del dirs[:]
continue
in_check_pkg = root.startswith('./sphinx')
@@ -201,7 +205,7 @@ def main(argv):
fn = join(root, fn)
if fn[:2] == './': fn = fn[2:]
- if '-i' in opts and abspath(fn) in opts['-i']:
+ if abspath(fn) in ignored_paths:
continue
ext = splitext(fn)[1]
@@ -213,8 +217,11 @@ def main(argv):
print "Checking %s..." % fn
try:
- f = open(fn, 'r')
- lines = list(f)
+ f = open(fn, 'rb')
+ try:
+ lines = list(f)
+ finally:
+ f.close()
except (IOError, OSError), err:
print "%s: cannot open: %s" % (fn, err)
num += 1
diff --git a/utils/convert.py b/utils/convert.py
new file mode 100644
index 00000000..f025c49a
--- /dev/null
+++ b/utils/convert.py
@@ -0,0 +1,43 @@
+#!/usr/bin/env python3
+# coding: utf-8
+"""
+ Converts files with 2to3
+ ~~~~~~~~~~~~~~~~~~~~~~~~
+
+ Creates a Python 3 version of each file.
+
+ The Python3 version of a file foo.py will be called foo3.py.
+
+ :copyright: Copyright 2010 by the Sphinx team, see AUTHORS.
+ :license: BSD, see LICENSE for details.
+"""
+import os
+import sys
+from glob import iglob
+from optparse import OptionParser
+from shutil import copy
+from distutils.util import run_2to3
+
+def main(argv):
+ parser = OptionParser(usage='%prog [path]')
+ parser.add_option('-i', '--ignorepath', dest='ignored_paths',
+ action='append', default=[])
+ options, args = parser.parse_args(argv)
+
+ ignored_paths = {os.path.abspath(p) for p in options.ignored_paths}
+
+ path = os.path.abspath(args[0]) if args else os.getcwd()
+ convertables = []
+ for filename in iglob(os.path.join(path, '*.py')):
+ if filename in ignored_paths:
+ continue
+ basename, ext = os.path.splitext(filename)
+ if basename.endswith('3'):
+ continue
+ filename3 = basename + '3' + ext
+ copy(filename, filename3)
+ convertables.append(filename3)
+ run_2to3(convertables)
+
+if __name__ == "__main__":
+ main(sys.argv[1:])
diff --git a/utils/reindent.py b/utils/reindent.py
index c499f671..59828fd8 100755
--- a/utils/reindent.py
+++ b/utils/reindent.py
@@ -1,16 +1,14 @@
#! /usr/bin/env python
# Released to the public domain, by Tim Peters, 03 October 2000.
-# -B option added by Georg Brandl, 2006.
"""reindent [-d][-r][-v] [ path ... ]
--d (--dryrun) Dry run. Analyze, but don't make any changes to files.
--r (--recurse) Recurse. Search for all .py files in subdirectories too.
--B (--no-backup) Don't write .bak backup files.
--v (--verbose) Verbose. Print informative msgs; else only names of \
-changed files.
--h (--help) Help. Print this usage information and exit.
+-d (--dryrun) Dry run. Analyze, but don't make any changes to, files.
+-r (--recurse) Recurse. Search for all .py files in subdirectories too.
+-n (--nobackup) No backup. Does not make a ".bak" file before reindenting.
+-v (--verbose) Verbose. Print informative msgs; else no output.
+-h (--help) Help. Print this usage information and exit.
Change Python (.py) files to use 4-space indents and no hard tab characters.
Also trim excess spaces and tabs from ends of lines, and remove empty lines
@@ -34,18 +32,30 @@ resulting .py file won't change it again).
The hard part of reindenting is figuring out what to do with comment
lines. So long as the input files get a clean bill of health from
tabnanny.py, reindent should do a good job.
+
+The backup file is a copy of the one that is being reindented. The ".bak"
+file is generated with shutil.copy(), but some corner cases regarding
+user/group and permissions could leave the backup file more readable that
+you'd prefer. You can always use the --nobackup option to prevent this.
"""
__version__ = "1"
import tokenize
-import os
+import os, shutil
import sys
-verbose = 0
-recurse = 0
-dryrun = 0
-no_backup = 0
+if sys.version_info >= (3, 0):
+ def tokens(readline, tokeneater):
+ for token in tokenize.tokenize(readline):
+ yield tokeneater(*token)
+else:
+ tokens = tokenize.tokenize
+
+verbose = 0
+recurse = 0
+dryrun = 0
+makebackup = True
def usage(msg=None):
if msg is not None:
@@ -61,12 +71,10 @@ def errprint(*args):
def main():
import getopt
- global verbose, recurse, dryrun, no_backup
-
+ global verbose, recurse, dryrun, makebackup
try:
- opts, args = getopt.getopt(sys.argv[1:], "drvhB",
- ["dryrun", "recurse", "verbose", "help",
- "no-backup"])
+ opts, args = getopt.getopt(sys.argv[1:], "drnvh",
+ ["dryrun", "recurse", "nobackup", "verbose", "help"])
except getopt.error, msg:
usage(msg)
return
@@ -75,10 +83,10 @@ def main():
dryrun += 1
elif o in ('-r', '--recurse'):
recurse += 1
+ elif o in ('-n', '--nobackup'):
+ makebackup = False
elif o in ('-v', '--verbose'):
verbose += 1
- elif o in ('-B', '--no-backup'):
- no_backup += 1
elif o in ('-h', '--help'):
usage()
return
@@ -98,7 +106,8 @@ def check(file):
for name in names:
fullname = os.path.join(file, name)
if ((recurse and os.path.isdir(fullname) and
- not os.path.islink(fullname))
+ not os.path.islink(fullname) and
+ not os.path.split(fullname)[1].startswith("."))
or name.lower().endswith(".py")):
check(fullname)
return
@@ -118,26 +127,35 @@ def check(file):
print "changed."
if dryrun:
print "But this is a dry run, so leaving it alone."
- else:
- print "reindented", file, \
- (dryrun and "(dry run => not really)" or "")
if not dryrun:
- if not no_backup:
- bak = file + ".bak"
- if os.path.exists(bak):
- os.remove(bak)
- os.rename(file, bak)
+ bak = file + ".bak"
+ if makebackup:
+ shutil.copyfile(file, bak)
if verbose:
- print "renamed", file, "to", bak
+ print "backed up", file, "to", bak
f = open(file, "w")
r.write(f)
f.close()
if verbose:
print "wrote new", file
+ return True
else:
if verbose:
print "unchanged."
+ return False
+
+def _rstrip(line, JUNK='\n \t'):
+ """Return line stripped of trailing spaces, tabs, newlines.
+
+ Note that line.rstrip() instead also strips sundry control characters,
+ but at least one known Emacs user expects to keep junk like that, not
+ mentioning Barry by name or anything <wink>.
+ """
+ i = len(line)
+ while i > 0 and line[i-1] in JUNK:
+ i -= 1
+ return line[:i]
class Reindenter:
@@ -151,7 +169,7 @@ class Reindenter:
# File lines, rstripped & tab-expanded. Dummy at start is so
# that we can use tokenize's 1-based line numbering easily.
# Note that a line is all-blank iff it's "\n".
- self.lines = [line.rstrip('\n \t').expandtabs() + "\n"
+ self.lines = [_rstrip(line).expandtabs() + "\n"
for line in self.raw]
self.lines.insert(0, None)
self.index = 1 # index into self.lines of next line
@@ -163,7 +181,7 @@ class Reindenter:
self.stats = []
def run(self):
- tokenize.tokenize(self.getline, self.tokeneater)
+ tokens(self.getline, self.tokeneater)
# Remove trailing empty lines.
lines = self.lines
while lines and lines[-1] == "\n":